处理视图中的nil(即@ post.author.name中的nil作者)

时间:2010-07-08 21:00:32

标签: ruby-on-rails ruby views null

我想要显示作者的姓名;除非作者为零,否则<% @post.author.name %>有效。所以我要么使用unless @post.author.nil?,要么添加一个在<% @post.author_name %>中检查nil的author_name方法。我试图避免后者。

问题是我可能需要根据是否有值来添加/删除单词。例如,如果我只显示nil,则“发布于1/2/3 by”将是内容。如果作者是零,我需要删除“by”。

4 个答案:

答案 0 :(得分:6)

Null object pattern是避免这种情况的一种方法。在你的班上:

def author
  super || build_author
end

这样你无论如何都会得到一个空作者。但是,由于您实际上并不希望在期望nil时有空对象,因此您可以使用某种类型的演示者。

class PostPresenter
  def initialize(post)
    @post = post
  end

  def post_author
    (@post.author && @post.author.name) || 'Anonymous'
  end
end

另一种方法是使用try,如@post.author.try(:name),如果您可以习惯这一点。

答案 1 :(得分:3)

您可以使用try

<%= @post.author.try(:name) %>

如果它是非零,它将尝试在name上调用@post.author方法。否则它将返回nil,并且不会引发任何异常。


回答您的第二个问题:原则上以下内容没有任何问题:

<% if @post.author %>
  written by <%= @post.author.name %>
<% end %>

<%= "written by #{@post.author.name}" if @post.author %>

但如果这是一个重复出现的模式,你可能想为它编写一个辅助方法。

# app/helpers/authors_helper.rb or app/helpers/people_helper.rb
class AuthorsHelper
  def written_by(author)
    "written by #{author.name}" if author
  end
end

# in your views
<%= written_by(@post.author) %>

答案 2 :(得分:0)

编写一个接受任何变量的方法,并检查它是否为nuil,如果它不显示它。那你只需要写一个方法。

答案 3 :(得分:0)

我发现你的问题很有趣,因为我经常遇到类似的情况,所以我想我会尝试制作我的第一个Rails插件。

我担心我还没有进行任何测试,但是你可以尝试一下http://github.com/reubenmallaby/acts_as_nothing(我正在使用Ruby 1.9.1,所以如果你在评论中或者在评论中遇到任何问题请告诉我Github上!)