在用户/显示页面中有条件地显示基于用户创建信息的用户

时间:2016-04-09 01:16:50

标签: ruby-on-rails user-profile

这是我得到的错误:

Showing /home/ubuntu/workspace/UMUV/app/views/users/show.html.erb where line #6 >>raised:

undefined method `name' for nil:NilClass

这是我在users / show中的条件:

<% 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或用户/控制器中创建方法,但真的不知道如何实现这个条件来做我想要的。

谢谢

3 个答案:

答案 0 :(得分:2)

在您的节目页面中,您可以将其替换为:

var xml=new XMLHttpRequest();
    var url="student.json";
    var data=document.getElementById("demo");
    xml.open("GET", url, true);
    xml.send();

用这个:

<% if @profile_info.present? %>
  <%= @profile_info.region.name %>
<% else %>
  <%= @user.email%>
<% end %>

并通过这篇文章:http://everydayrails.com/2011/04/28/rails-try-method.html

答案 1 :(得分:1)

你总是可以使用new_record测试一个初始化对象与一个保存的对象吗? - 这将使您的上述视图看起来更像:

<% if @profile_info.new_record? %>
  <%= @user.email%>
<% else %>
  <%= @profile_info.region.name %>
<% end %>

您也可以在页面的某个部分利用try,如果某个属性不存在,则会优雅地失败,例如

@profile_info.region.try(:name)

答案 2 :(得分:0)

由于您的错误名称@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 %>

我希望有所帮助!