日別アーカイブ: 2022年2月3日

NoMethodError in ***Controller#show(エラー対処備忘録)

NoMethodError in ***Controller#show

undefined method `***’ for nil:NilClass

Extracted source (around line #30):
28
29
30
31
32
33
def show
   @macs = @user.macs.page(params[:page]).per(8)
end
def update

ハマってしまったので、同じことを繰り返さないために。

経緯

<span class="btn-sticky">すべての更新、作成日時を表示,非表示</span>
<% if @user.macs.any? %>
  <% @user.macs.each do |mac| %>
    <section class="panel">
      <div class="panel-left">
          <h2>目標:<%= mac.measurable %></h2>
          <h2>ゴールまでのプロセス<br><%= mac.actionable %></h2>
          <h2>目標達成が価値観に基づいているか?<br><%= mac.competent %></h2>
          <li><h3>更新日時:<%= mac.updated_at.to_s(:datetime_jp) %></h3>
            <h3>作成日時:<%= mac.created_at.to_s(:datetime_jp) %></h3></li>
        </ul>
      </div>
      <div class="panel-right">
        <%= link_to(content_tag(:i, '', class: "fas fa-trash-alt fa-3x faa-horizontal animated-hover fa-pull-right", style: "color: rgb(80,80,80);"), mac_path(mac.id), method: :delete, data: {confirm: "本当に削除しますか?"}) %>
        <%= link_to(content_tag(:i, '', class: "fas fa-edit fa-3x faa-vertical animated-hover fa-pull-right", style: "color: rgb(80,80,80);"), edit_mac_path(mac.id)) %>
    </section>
  <% end %>
<% end %>
<%= render 'shared/script' %>

user_idに紐付いたmacモデルのもの(:measurable, :actionable, :competent)を繰り返しで表示させたかった。

原因

***_controller.rb

def show
  @macs = @user.macs.page(params[:page]).per(8)
end

@userをmacs_controller.rbに定義していなかったためnilになった。

機能がほぼ同じだったので他のコントローラーからコピペしたせいで

リファクタリングでprivate にあった@user = User.find(params[:id])

を見落としていたため。

解決法

***_controller.rb

def show
  @user = User.find(params[:id])
  @macs = @user.macs.page(params[:page]).per(8)
end

@user = User.find(params[:id])