Rails在显示之前检查对象存在的方式

时间:2010-09-25 19:13:52

标签: ruby-on-rails ruby-on-rails-3

我希望找到一种很好的方法来检查我的对象,然后才能在视图中显示它们,这样我就不会出错了。

这是我的控制器

 @user = User.find_by_username(params[:username])
 @profile = @user.profile 
 @questions = @user.questions

这是我的观点

 <% unless @profile.blank? %><%= link_to 'Edit Profile', :controller => 'profiles', :action => 'edit' %><% end %>


     <% unless @user.blank? %>
        Username:<%= @user.username %><br />
    Member Since:<%= @user.created_at.strftime("%d %B %Y")  %><br />
    <% end %>

  <% unless @profile.blank? %>
    First Name: <%= @profile.first_name %><br />
    Last Name: <%= @profile.last_name %><br /><br />
    About: <%= @profile.body %><br /><br />
    Location: <%= @profile.location %><br />
    Birthday: <%= @profile.birthday.strftime("%d %B %Y") %><br />
    <% end %>

正如你所看到的,我正在使用不止一种检查(检查除非@ profile.blank?),我认为会有更好的方法来做到这一点。

Rails是否有办法比我想出的更聪明?

5 个答案:

答案 0 :(得分:9)

另外

<%= if @object.present? %>
对我来说,

看起来比

简单得多
<%= unless @object.blank? %>

特别是当我们有多个条件语句时(&& \ || \ and \ or)。

api.rubyonrails.org

答案 1 :(得分:5)

正如我所见,你无法跳过这个@ .blank?验证,因为你不想显示记录,如果它们是空的但我没有什么建议

1 - 将以下部分作为部分

<% unless @user.blank? %>
    Username:<%= @user.username %><br />
    Member Since:<%= @user.created_at.strftime("%d %B %Y")  %><br />
<% end %>

<% unless @profile.blank? %>
  First Name: <%= @profile.first_name %><br />
  Last Name: <%= @profile.last_name %><br /><br />
  About: <%= @profile.body %><br /><br />
  Location: <%= @profile.location %><br />
  Birthday: <%= @profile.birthday.strftime("%d %B %Y") %><br />
<% end %>

它可以让您的视图更清晰,并且可以让您灵活地在应用中的任何软件中使用它们

2 - 采取以下行

<% unless @profile.blank? %><%= link_to 'Edit Profile', :controller => 'profiles', :action=> 'edit' %><% end %>

在个人资料中显示为更合适

欢呼声

sameera

答案 2 :(得分:1)

根据rails文档,您可以使用association.nil查看是否存在任何关联对象?方法:

if @book.author.nil?
  @msg = "No author found for this book"
end

答案 3 :(得分:0)

如何在保存之前为用户构建空配置文件?如何使用带有感叹号的类比来提升ActiveRecord::RecordNotFound,而{{1}}将显示404页面。

P.S。我还建议将控制器修剪为一个实例变量。

答案 4 :(得分:0)

可能的方法是使用Object#presence

您应该始终像以前一样unless @object.blank?