プログラミングの勉強日記
2020年7月14日 Progate Lv.196
Ruby on RailsⅢ
find_byメソッド
find_byメソッドはある条件に合致するデータを取得できる。モデル名.find_by(カラム名: 値)
とすることで、その値を持ったデータをデータベースから取得できる。今回は特定のidの投稿を取得するために使える。
$ rails console
//idが3の投稿データを取得できる
> post=Post.find_by(id:3)
> post.content
=> "Rails勉強中"
URLにidを含める
ルーティングのURL部分に:
を用いてposts/:id
と指定することでposts/1
でもposts/2
でもshowアクションにいくようにできる。
get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"
posts/:id
のルーティングはposts/index
よりも下に書く。ルーティングは合致するURLを上から順に探すので、posts/index
より上に書くと、localhost:3000/posts/index
というURLがposts/:id
に合致してしまう。
def show
end
変数params
コントローラのアクション内ではルーティングで設定したURLの:id
の値を取得できる。その値はparamsという変数にハッシュとして入っている。params[:id]
とすることでその値を取得できる。
def show
@id=params[:id]
end
<%= id %>
ブラウザ(localhost:3000/posts/1
):1 (と表示される)
ブラウザ(localhost:3000/posts/2
) :2 (と表示される)
リンクの作成
link_toメソッドを使う。link_toメソッドはRubyのコードで、第一引数に表示する文字を第二引数にURLを書くことでリンクを作成する。
<%# 変数展開を用いて投稿のidを指定 %>
<%= link_to(post.content, "/posts/#{post.id}") %>
投稿内容を受け取るアクションの用意
フォームの投稿ボタンを押すとRails側に投稿データを送信できる。今回はcreateアクションを用意して受け取ったデータをデータベースに保存する。
ルーティングを書くときにフォームの値を受け取る場合はpost
とする。
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"
form_tag
メソッドを用いるとフォームに入力されたデータを送信することができる。form_tag
はform_tag(送信先のURL) do
のように送信先のURLを指定する。これによって、<input type="submit" ....>
のボタンを押したときに指定されたURLにデータが送信される。
<% form_tag("/posts/create") do %>
<textarea></textarea>
<input type="submit" value="投稿">
<% end %>
リダイレクト
他のURLに転送(リダイレクト)するには、redirect_to
メソッドを用いる。redirect_to(URL)
でそのページに転送することができる。
def create
redirect_to("/posts/index")
end
投稿内容の保存
①<textarea>
タグにname属性を指定すると、入力データを送信することができるようになり、name属性の値をキーとしたハッシュがRails側に送られる。
<textareaname="content"></textarea>
②name属性を指定したフォームに入力されたデータはコントローラのアクション内で受け取れる。フォームのデータは変数paramsで受け取る。paramsはname属性に設定した文字列をキーとしたハッシュになっている。
def create
params[:content]
end
③実際にデータベースに投稿を保存する。Postインスタンスを作成するときに、params[:content]
を用いる。そのPostインスタンスを保存することで投稿機能ができる。
def create
@post=Post.new(content: params[:content])
@post.save
redirect_to("/posts/index")
end
投稿の並び替え
orderメソッドを用いる投稿一覧を並び替えられる。order(カラム名:並び替えの順序)
のように使う。並び替えの順番は昇順(:asc
)と降順(desc
)のどちらかを選択する。
def index
@post=Post.all.order(created_at: :desc)
end