未定义的方法,错误的关联或呼叫?

时间:2016-05-06 22:56:16

标签: ruby-on-rails activerecord

我尝试为每个用户制作累积show.html,显示来自4个不同模型的一些数据。那些表格:

fragment of database model image

问题是我不知道如何从每个Button的网站表调用数据。显示按钮'数据没有问题。 html的那部分应该是这样的:

<% if @profile.buttons.any? %>
  <ul>
  <% @buttons.each do |button| %>
    <li>
    <%= button.website.name %>
    <%= link_to button.user_website_url, button.user_website_url %>
    </li>
  <% end %>
  </ul>
<% else %>
  <p>None websites added. Please finish your profile creation.</p>
<% end %>

型号:

class Website < ActiveRecord::Base
 has_many :buttons
 mount_uploader :logo, LogoUploader
 validates :name, presence: true, length: { maximum: 50 }
 validates :logo, presence: true
end

class Button < ActiveRecord::Base
  belongs_to :profile
  belongs_to :website
  accepts_nested_attributes_for :website
  validates :description, length: { maximum: 140 }
  validates :user_website_url, presence: true, length: { maximum: 200 }
end

class Profile < ActiveRecord::Base
  belongs_to :user
  has_many :buttons, :dependent => :destroy
  #...
end

用户控制器:

def show
  @user = User.find(params[:id])
  @profile = @user.profile
  @buttons = @profile.buttons
end

在这种情况下,我收到了错误:

  

未定义的方法`name&#39;为零:NilClass

那么,这有什么问题?我尝试了很多种关联,我得到了上面提到的错误,或者没有ID传递给每个网站(错误的查询)(我也不知道如何处理) )。

3 个答案:

答案 0 :(得分:0)

这可能是因为没有关联网站的按钮。见行:

<%= button.website.name %>

如果其中一个按钮的website_idnil,则在nil值上调用方法name会产生您看到的错误。

答案 1 :(得分:0)

以下代码有问题,button.website返回nil,而nil没有方法name

<%= button.website.name %> 

要修复它,只需使用try:

<%= button.try(:website).try(:name) %>

答案 2 :(得分:0)

此行引发错误<%= button.website.name %>

.name没有获得任何价值,因为按钮没有任何关联的网站,这就是为什么它会将nil:NilClass作为错误返回。