Rubyの復習

紹介

yieldについて

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>MessageBoard</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

index.html.erb や show.html.erb などの各ページが入る。

<Message::ActiveRecord_Relation:0x00007ffac5a15f78>

viewに@messagesをこのように渡した場合の挙動

  def index
    @messages = Message.all
<ul>
  <%= @messages %>
</ul>

保存が失敗したときには messages/new.html.erb を表示するように指定しています。 @message = Message.new(message_params) によって @message インスタンスは残っており @message.content には値が入っているので、 new.html.erb 内のフォームにある form_for(@message) 内の content の入力欄にはたった今失敗した文字列値が予め入力された状態になる。

flash[:success] = 'Message が正常に投稿されました' は、 @message.save が成功したときに実行される。 flash はハッシュなので、 { success: 'Message が正常に投稿されました' } という形で保存される。 これが Controller (MessagesController) から View (app/views/layouts/_flash_messages.html.erb) へ受け渡され、表示される。

<% flash.each do |message_type, message| %>
  <div><%= message %></div>
<% end %>

上記は、flash に代入された全てのメッセージが1つ1つ取り出されて、全て表示される。 ハッシュであるため、 each で取り出すと、 |key, value| のペアで取り出される。 今回は |message_type, message| という変数名を用いている。 @message.save が成功した場合、 message_type には :success が代入され、message に 'Message が正常に投稿されました' が代入され、message のみ表示される。

  def destroy
    @message = Message.find(params[:id])
    @message.destroy

    flash[:success] = 'Message は正常に削除されました'
    redirect_to messages_url
  end

今まではprefix_path だがリダイレクトの場合だけは prefix_url を使用する。

f:id:shiness:20210117160120p:plainf:id:shiness:20210117160133p:plain

Prefix + _path となっている。 :id が必要なものはインスタンスを特定する必要があるので引数として @message などのインスタンスが必要。 今後もこの法則で自動生成されるメソッド(prefix_path)を使って、リンクを生成する。

link_to redirect_to

【Rails】link_toの使い方をマスターして簡単にリンクを作成し | Pikawaka - ピカ1わかりやすいプログラミング用語サイト