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
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.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で定義したデフォルトオプションと比較してみて>ください。)