背景

Page#homeで記事一覧(Posts#index)を表示し、そこに記事詳細(Posts#show)をリンクを貼った。そのときに学んだ事の備忘録。

結論

記事詳細リンクはこう貼った。(成功したコード)

<% if @posts.any? %>
<% @posts.each do |p| %>

#記事詳細のリンク↓
 ++<%= link_to post_path(p), class: 'text-body' do %> <div class="card mt-4">
      <%= image_tag p.image.url, class: 'img-fluid' %>
<div class="card-body">
        <h5 class="card-title"><%= p.title %></h5>
<p class="card-text"><%= p.tag %></p>
</div>
</div>
<% end %>
<% end %> <% end %>


エラーが起きたコード

Couldn't find Post without an ID / ActiveRecord::RecordNotFound

<% if @posts.any? %>
++ <%= link_to post_path(post), class: 'text-body' do %> 

 <% @posts.each do |p| %>
<div class="card mt-4">
    <%= link_to post_path(p), class: 'text-body' do %> <%= image_tag p.image.url, class: 'img-fluid' %>
      <div class="card-body">
        <h5 class="card-title"><%= p.title %></h5>
<p class="card-text"><%= p.tag %></p>
</div>
</div>
<% end %> ++ <% end %>
<% end %>

なぜこれでワークしたのか?

restfulのこのコードは、

post_path(post)

繰り返し処理の

<% @posts.each do |post| %>

|post|からきている。


繰り返し処理の外で、

<%= link_to post_path(post), class: 'text-body' do %> 

と書くと、(post)の意味がコンピュータにはわからなくなる。

もう一度うまく行ったコード

<% if @posts.any? %>
<% @posts.each do |p| %>

#記事詳細のリンク↓
 ++<%= link_to post_path(p), class: 'text-body' do %> <div class="card mt-4">
      <%= image_tag p.image.url, class: 'img-fluid' %>
<div class="card-body">
        <h5 class="card-title"><%= p.title %></h5>
<p class="card-text"><%= p.tag %></p>
</div>
</div>
<% end %>
<% end %> <% end %>

この記事を参考にしました。https://skillhub.jp/courses/158/lessons/835

さいごに

本当にループ内でしか記事詳細は機能しないのかはわかりませんが(ユーザープロフィールなどでは、ループは記述していなくても、記事詳細のリンクはワークしている。)、とりあえずうまく行っているので、深くは追求しません。