这是我得到的错误:
Showing /home/ubuntu/workspace/UMUV/app/views/users/show.html.erb where line #6 >>raised:
undefined method `name' for nil:NilClass
这是我在用户/节目中的条件:
<% if @profile_info.present? %>
<%= @profile_info.region.name %>
<% else %>
<%= @user.email%>
<% end %>
这是在用户/控制器中:
def show
@user = User.find(params[:id])
@profile_info = Profile.find_or_initialize_by(user_id: params[:id])
end
我基本上想知道当我访问用户的个人资料页面并且用户尚未更新其个人资料时如何不出现错误。如果我通过"编辑页面"手动更新用户的个人资料,则显示页面工作正常。
请帮助有条件的。我也有一种感觉,我可以在user.rb或用户/控制器中创建方法,但真的不知道如何实现这个条件来做我想做的事情。
谢谢
在您的节目页面中,您可以替换以下内容:
<% if @profile_info.present? %>
<%= @profile_info.region.name %>
<% else %>
<%= @user.email%>
<% end %>
有了这个:
<% if @profile_info.present? %>
<%= @profile_info.region.try(:name) %>
<% else %>
<%= @user.try(:email)%>
<% end %>
还要通过这篇文章:http://everydayrails.com/2011/04/28/rails-try-method.html
你总是可以使用new_record测试一个初始对象和一个保存的对象? - 这将使您的上述视图看起来更像:
<% if @profile_info.new_record? %>
<%= @user.email%>
<% else %>
<%= @profile_info.region.name %>
<% end %>
此外,您还可以利用页面部分try
,如果属性不存在,则页面会正常失败,例如
@profile_info.region.try(:name)
您的错误与名称@profile_info.region.name
不存在有关,因此您可以将条件更改为:
<% if @profile_info.region.name.present? %>
<%= @profile_info.region.name %>
<% else %>
<%= @user.email%>
<% end %>
或者,如果您真的想测试@profile_info.present?
则可以像这样嵌套条件:
<% if @profile_info.present? %>
<% if @profile_info.region.name.present? %>
<%= @profile_info.region.name %>
<% end %>
<% else %>
<%= @user.email%>
<% end %>
我希望这有所帮助!