Rails 投稿詳細ページ & 新規投稿ページの作成
今日は前回の続きで
- 投稿詳細ページ
- 新規投稿ページ
を書いていきます
今の状態は
ルーティングとコントローラはposts/index,
ビューもindex.html.erbのみになります
DBにはPostモデルが作成されています
- 投稿詳細ページ
まずルーティングは
get "posts/:id" => "posts#show"
とします
これは投稿されたデータが持つidカラムがいくつでもshowコントローラに移動するということです。(つまりposts/1でもposts/2でもposts/〜の投稿をshowコントローラに持っていきたいということです)
ここで重要なのはposts/〜を全てshowコントローラに送ってしまうのでルーティングを後に書かないエラーが起きるので注意しましょう!
次にshowコントローラは
def show
@post = Post.find_by(id: params[:id])
end
とします
ここに出てくるfind_byというのはDBから情報を持ってくるメソッドで、params[:カラム名]の役割は
以上の2点です。
次にshow.html.erbファイルをpostsビューに作成してそのファイル内に
<%= @post.content %>
など必要な情報が入ったカラム名を書いて表示されるようにしましょう
次にposts/index.html.erbファイルにshow.html.erbファイルへのリンク
<%= link_to(post.content, "/posts/#{post.id}") %>
ここで@postじゃなくてpostなのはposts/index.html.erb内に@posts.each do |post| 文があって定義されているからです(詳しくは前回の記事を参照)
これで投稿詳細ページは完成です
新規投稿ページ
まずはこちらもルーティング→コントローラ→(必要に応じて)ビューにファイル作成の流れに乗って
ルーティング
get "posts/new" => "posts#new"
コントローラ
def new
end
newコントローラはここではとりあえず空でOKです
次にnew.html.erbファイルを作成し、その中に入力フォームに必要な
< textarea name="content"></textarea>
<input type="submit" value="投稿">
を書きます
そしてここで必要なのがcreateアクションになるのですが、今まではDBから情報を得てそれを表示するだけだったのですが、DBに情報を与える,もしくは変更がある場合にはルーティングを書く際にも書き方などが変わってきます
ではまずルーティング
post "posts/create" => "posts#create"
ここではgetがpostに変わってます
次はコントローラ
def create
@post = Post.find_by(id: params[:id])
@post.save
redirect_to("/posts/index")
end
値を取得し、DBに変更があるので@post.saveで保存
redirect_to("URL")はそのURLのページに転送することです
最後にpost ルーティングはビューファイルを持たないので、new.html.erbの方に
<%= form_tag("/posts/create") do %>
〜
<% end %>
で< textarea>と<input>を囲います
form_tagで送信されたURLではDBに情報を加えるなどの変更があります
そしてこれで新規作成ページの完成です
お疲れ様でした…
土日は時間が中々取れなくてプログラミングの勉強もちゃんとしたブログを書く時間もありませんが、細々とでも毎日続けたいです