显示相同信息的用户列表

时间:2014-10-22 15:43:25

标签: ruby-on-rails

我正在显示所有用户的订阅信息。我遇到的问题是它没有显示正确的信息。它显示所有用户的current_user订阅信息。什么时候应该显示每个用户唯一的订阅信息。

管理员观点:

<% @users.each do |user| %>
<li>
<%= link_to user.username, user %>
|<%= @user.subscription.id %>|<%= @user.subscription.plan.name %>| <%= @user.subscription.created_at.strftime("%B %e, %Y") %>
</li>
<% end %>

管理员控制器:

  def index
    @user = current_user
    @users = @user.present? ? User.where('id != ?',@user.id) : User.all

    render layout: 'new_application'    
  end

  def show
    @user = User.find_by(username: params[:id])
  end

错误:NoMethodError: undefined method `id' for nil:NilClass

1 个答案:

答案 0 :(得分:4)

模板似乎应该引用user,而不是@user

更新

正如@ rlecaro2所提到的,你可能有一些用户有任何订阅。在这种情况下,在.subscription变量上调用user会返回nil并在您要求id时崩溃。

<% @users.each do |user| %>
  <li>
    <%= link_to user.username, user %>
    <% if user.subscription %>
      |<%= user.subscription.id %>|<%= user.subscription.plan.name %>| <%= user.subscription.created_at.strftime("%B %e, %Y") %>
    <% end %>
  </li>
<% end %>

此外,由于您要求每个用户提供其subscription及更高版本的订阅计划,因此您应该明确加载这些以避免不必要的查询。对于Rails 4,Admin控制器应如下所示:

def index
  @users = User.includes(subscription: :plan)
  @users = @users.where.not(id: current_user.id) if current_user

  render layout: 'new_application'
end

请注意,没有必要通过current_user传送@user。您可以直接在模板中引用它。