我想要显示作者的姓名;除非作者为零,否则<% @post.author.name %>
有效。所以我要么使用unless @post.author.nil?
,要么添加一个在<% @post.author_name %>
中检查nil的author_name方法。我试图避免后者。
问题是我可能需要根据是否有值来添加/删除单词。例如,如果我只显示nil,则“发布于1/2/3 by”将是内容。如果作者是零,我需要删除“by”。
答案 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上!)