RoR Rnder部分无法找到方法

时间:2016-02-16 13:41:47

标签: ruby-on-rails

我有一个用户和公司类,我想重新使用用户部分作为渲染公司员工。

CompaniesController我有:

def staff
  @company=Company.find(params[:id])
  @users=@company.works_fors.paginate(page: params[:page], :per_page => 10)
  @title=@company.name+" staff."
end

在我的staff.html.erb模板中,我有:

<% if @users.any? %>
  <ul class="users follow">
    <%= render @users %> 
  </ul>
  <%= will_paginate %>
<% end %>

这是works_fors/_works_for部分:

<%= render :partial => 'user' %>

哪个渲染

<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
  <% if current_user.developer? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
  <% end %>
</li>

但是,由于无法找到方法

,因此会在用户对象上引发错误

未定义的局部变量或方法`user&#39;对于~~

我认为这是因为我从公司内部调用用户对象但是存在已定义的关系,或者我是否需要在公司中重新定义?

1 个答案:

答案 0 :(得分:3)

很难说,但您在控制器中调用@users的内容实际上不是User集合,而是WorkFor集合。

@users = @company.works_fors...

你的意思是:

@works_fors = @company.works_fors...

这意味着staff.html.erb正在使用works_for集合。因此,您应该重命名模板中的变量以避免混淆。

# staff.html.erb
<% if @works_fors.any? %>
  <ul class="users follow">
    <%= render @works_fors %> 
  </ul>
  <%= will_paginate @works_fors %>
<% end %>

现在我们知道我们正在渲染works_for部分。因此,部分内部可以使用works_for的实例。我们需要询问它的关联用户实例,并将其传递给render方法。

 # works_fors/_works_for.html.erb
 <%= render works_for.user %>

作为奖励,您可以通过预加载用户来保存自己的一些查询。

@works_fors = @company.works_fors.includes(:user)...