Rails 投稿詳細ページ & 新規投稿ページの作成

f:id:takayanagi-prg:20180909052850j:image

 

今日は前回の続きで

  • 投稿詳細ページ

 

  • 新規投稿ページ

 

を書いていきます

 

今の状態は

ルーティングとコントローラは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[:カラム名]の役割は

  1. [ : カラム名] の入ったルーティングのURLから値を取得する
  2. name="カラム名"が付いたフォームの入力内容を受け取る

以上の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に情報を加えるなどの変更があります

 

そしてこれで新規作成ページの完成です

 

お疲れ様でした…

 

土日は時間が中々取れなくてプログラミングの勉強もちゃんとしたブログを書く時間もありませんが、細々とでも毎日続けたいです