yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY89>kaminari perで指定した引数と表示が異なる

\ Follow me!! /

f:id:yujiro0320:20190512223713p:plain

学習状況

●学習日数 89日 

●学習時間(本日) 8.5時間

●累計学習時間 357.5時間

●一日あたりの平均学習時間 3.96時間 

結論

部分テンプレートの渡し方に問題あり。

<% @tweets.each do |tweet|%>
  <%= render  @tweets %> (繰り返し処理が重複)
 <%end%>

以下に変更で解決

  <%= render  @tweets %> 

部分テンプレートについて

下記記事を参考にしました。

qiita.com

慣れるまでは、明示的な書き方にしておいた方がよさそうだ。

表示がおかしかった時のview画面。

<div class="container">
<div class="box">
<% @tweets.each do |tweet|%>
  <%= render  @tweets %>
 <%end%>
</div>
<%= paginate(@tweets)%>
 </div>

これを正しく意図した形で部分テンプレート呼び出すには、

<div class="container">
<div class="box">
<% @tweets.each do |tweet|%>
  <%= render  partial: "tweet",locals: { tweet: tweet }%>
 <%end%>
</div>
<%= paginate(@tweets)%>
 </div>

部分テンプレートでは名前が_tweetのviewでも変数はtweetとして使えるようにすると定義。 以下形でも全く同じ挙動をとるが、eachを外す必要がある。

<div class="container">
<div class="box">
  <%= render  @tweets %>
</div>
<%= paginate(@tweets)%>
 </div>

理由は、render @tweetsとするとモデルから引っ張ってきたデータをそのまま ビューに連続表示してくれる。つまりeachの役割をしてくれるからだ。 ちなみに、コントローラでは以下記述をしている。

 @tweets = Tweet.includes(:user).order(created_at: :DESC).page(params[:page]).per(5)

上記の認識がなく、eachとrender @tweets と2重でeachをかけている状態であった。 なので、渡した引数の2乗分のデーターが表示されていた。

最後に

エラー解決できたのが非常に嬉しい!