我正在显示所有用户的订阅信息。我遇到的问题是它没有显示正确的信息。它显示所有用户的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
答案 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
。您可以直接在模板中引用它。