RailsTutorial12章

複合キーインデックス

add_index :microposts, [:user_id, :created_at]

newではなくbuildで書くとアソシエーションベースでインスタンス生成している ことを明示することになる。

proc

default_scope -> { order(created_at: :desc) }
>> -> { puts "foo" }
=> #<Proc:0x007fab938d0108@(irb):1 (lambda)>
>> -> { puts "foo" }.call
foo
=> nil

f:id:shiness:20210117231514p:plainf:id:shiness:20210117231514p:plain

render記法

<ol class="microposts">
  <%= render @microposts %>
</ol>

パーシャルを使って自動的に@users変数内のそれぞれのユーザーを出力していました。これを参考に、>_micropost.html.erbパーシャルを使ってマイクロポストのコレクションを表示しようとすると、次のよ>うになります。

<%= will_paginate %>

実は、上のコードは引数なしで動作していました。これはwill_paginateが、Usersコントローラのコンテ>キストにおいて、@usersインスタンス変数が存在していることを前提としているためです。このインス>タンス変数は、10.3.3でも述べたようにActiveRecord::Relationクラスのインスタンスです。今回の場合 はUsersコントローラのコンテキストからマイクロポストをページネーションしたいため(つまりコン テキストが異なるため)、明示的に@microposts変数をwill_paginateに渡す必要があります。したがっ て、そのようなインスタンス変数をUsersコントローラのshowアクションで定義しなければなりません (リスト 13.23)。

f:id:shiness:20210117235329p:plain

f.object

f.objectについて

app/views/shared/_micropost_form.html.erb

<%= form_with(model: @micropost, local: true) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new micropost..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

sharedでuserとmicropostsで切り替えてくれたら嬉しい。 renderのあとでパーシャルの先で渡した(変数なんでもよい)をローカル変数として呼び出せる <%= render 'shared/error_messages', object: f.object %>

コードリーディング

@micropost = current_user.microposts.find_by(id: params[:id])

    def correct_user
      @micropost = current_user.microposts.find_by(id: params[:id])
      redirect_to root_url if @micropost.nil?
    end

 コードリーディング

redirect_to request.referrer || root_url

ここではrequest.referrerというメソッドを使っています14 。このメソッドはフレンドリーフォワーデ>ィングのrequest.url変数(10.2.3)と似ていて、一つ前のURLを返します(今回の場合、Homeページ: になります)15 。このため、マイクロポストがHomeページから削除された場合でもプロフィールペ ージから削除された場合でも、request.referrerを使うことでDELETEリクエストが発行されたページ に戻すことができるので、非常に便利です。ちなみに、元に戻すURLが見つからなかった場合でも (例えばテストではnilが返ってくることもあります)、リスト 13.53の||演算子でroot_urlをデフォル トに設定しているため、大丈夫です。(リスト 9.24で定義したデフォルトオプションと比較してみて>ください。)