Railsのあれこれ その1
エラーメッセージ
コントローラー
@post.errors.full_messages
でエラーメッセージを取得する。 この場合は
@post
というインスタンスに入ったエラーメッセージをすべて取得している。
これをビューで表示させるには
<% @post.errors.full_messages.each do |message| %> <%= message %> <% end %>
とすればよい。 eachでループを回してすべてを表示させる。
フラッシュ
フラッシュのメッセージを表示させる。
コントローラーで
flash[:notice] = "入れたいメッセージ"
と書くと、フラッシュのメッセージが1回だけ表示できるようになる。
実際にビューで表示させるには
app>>views>>layouts>>application.html.erb
の中で
<header> </header> #ここを追加 <% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %> #ここまで追加 <%= yield %>
とすればよい。
renderメソッドについて
renderメソッド。 別のアクションを経由せずに、直接ビューを表示するためのもの。
render("フォルダ名/ファイル名")
とすればよい。
投稿に失敗したときにもう一度投稿画面を表示するときなどに使う。
アクション内で定義していた@変数は、ビューで使うことが可能。
ルーティング(routes.rb)で
get "posts/:id/edit" => "posts#edit"
などのようにしていた場合でも
renderメソッドでは
render("posts/edit")
などのようにすればよく、id番号は必要ない。
記事の投稿
投稿をするばあいは get ではなく post を使う。
ルーティング(routes.rb)に
post "posts/create" => "posts#create"
を追加。 コントローラーにcreateアクションを追加する。
createアクションの中身は
def create @post = Post.new(content: params[:text]) if @post.save flash[:notice] = "投稿を作成しました" redirect_to("/posts/index") else render("posts/new") end end
のようにして、投稿に成功するとフラッシュメッセージを出すようにし、 投稿に失敗した場合はもう一度、newアクションに行くようにする。
newアクションは
def new @post = Post.new end
とすればよい。
ビューは、createは必要ない。 new.html.erbというビューのファイルを作り、
<%= form_tag("/posts/create") do %> <% @post.errors.full_messages.each do | message | %> <%= message %> <% end %> <textarea name="text"><%= @post.text %></textarea> <input type="submit" value="投稿"> <% end %>
このようにすればよい。 エラーメッセージを表示させているのと、
<textarea name="text"><%= @post.text %></textarea>
のようにして、textareaタグの中で、投稿が失敗した場合に投稿前のテキストが入るようにしてあるのがポイントである。
削除について
投稿の削除は
ルーティング(routes.rb)で
post "posts/:id/destroy" => "posts#destroy"
のようにする。
postであることに注意する。(destroyとupdate、createはpostである。createにはidは要らない。)
アクションは
def destroy @post = Post.find_by(id: params[:id]) @post.destroy flash[:notice] = "投稿を削除したよ" redirect_to("/posts/index") end
のようにすればよい。
リンクは
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
のようにリンクを貼る。
destroyのリンクでは
{method: "post"}
のようにして「postである」ということを明示する。 投稿フォームではないので、このような記述が必要になる。