Posted at

Progate rails道場コースⅡ 個人的攻略メモ

ProgateのRails道場コースをやっていて、個人的に復習が必要だなーって感じたところをまとめていきます。


3/8 新規投稿ページを作ろう


ルーティングの注意点

  get "posts/index" => "posts#index"

get "posts/:id" => "posts#show"
get "posts/new" => "posts#new"

このような場合3行目のposts/newは2行目のpost/:idにマッチする。

そのため、以下のように変更が必要。

  get "posts/index" => "posts#index"

get "posts/new" => "posts#new"
get "posts/:id" => "posts#show"

:idとかは最後に置くべき。

/posts/:idだと、/posts/〇〇のような全てのURLに該当するため。


4/8 投稿を保存しよう


<%= form_tag("/posts/create") do %>
<textarea name="content">
</textarea>
<input type="submit" value="投稿">
<% end %>

2行目のtextareaにname属性を付与することで、コントローラ内でデータを受け取れる

#posts_controller.rb

def create
#textarea内のデータを受け取り、インスタンス変数@postへ保存
@post = Post.new(content: params[:content])
@post.save
redirect_to("/posts/index")
end


5/8 サクセス・エラーメッセージ

サクセス・エラーメッセージを表示する手順


保存に成功or不成功で処理を分岐

  def create

@post = Post.new(content: params[:content])
if @post.save
# 投稿の保存に成功したときの処理
flash[:notice] = "投稿を作成しました"
redirect_to("/posts/index")
else
# 投稿の保存に失敗したときの処理
render("/posts/new")
end
end


成功の場合

投稿内容を取得(textareaのname属性より)

@post = Post.new(content: params[:content])

アクション内でflashという変数に文字列を代入することで、フラッシュメッセージとして使えるようになります。

flash[:notice] = "投稿を作成しました"


不成功の場合

renderメソッドで新規投稿画面を再表示。

renderメソッドはredirect_toと違い、httpリクエストの送信を行わず、viewの出力のみを行います。URLではなく、ファイル名/フォルダ名での指定のため、先頭の/は不要です。

#render("フォルダ名/ファイル名")

render("posts/new")

テキストエリア内に初期値を設定。

createアクション内で取得した内容が、renderメソッドにより値を保持したまま他のビュー(ここだとnew.html.erb)でも使えるようになってます。

<!-- new.html.erbの投稿欄 -->

<textarea name="content"><%= @post.content %></textarea>

なお、new.html.erbでインスタンス変数@postを利用するようになりましたが、対応するnewアクションでは何も書いていません。そのため、/posts/newで新規投稿ページにアクセスしようとすると、テキストエリア内初期値の@post.contentが読み込めず、エラーを起こします。

これを防ぐために、newアクション内に空のインスタンスを用意してあげましょう。

  def new

@post = Post.new
end

これでよし。


6/8 投稿の編集ページを作ろう

編集ページへのルーティングとリンクを作成。


ルーティング

get "posts/:id/edit" => "posts#edit"

:idでURLに含まれるIDを取得できるようになりました。

(例:posts/1/edit post/2/edit)


リンクの作成

投稿詳細ページに、上記のルーティングにマッチするリンクを作成します。

<%= link_to("編集", "/posts/#{@post.id}/edit") %>

変数展開を用いて、現在見ている投稿のIDをURLに埋め込んで渡してあげます。


8/8 削除機能を作ろう

投稿詳細ページに削除リンクを追加

 <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>

link_toメソッドの第三引数に、{method: "post"}を指定するのを忘れずに!

コントローラー側

  def destroy

#投稿データの取得
@post = Post.find_by(id: params[:id])
#dedtroyメソッドでデータの削除
@post.destroy
flash[:notice] = "投稿を削除しました"
redirect_to("/posts/index")
end

以上で完成!お疲れ様でしたー!!