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

发布于 2024-09-08 09:35:22 字数 286 浏览 4 评论 0原文

我想显示帖子作者的姓名; <% @post.author.name %> 有效,除非作者为零。所以我要么使用unless @post.author.nil?,要么添加一个author_name方法来检查nil,如<% @post.author_name %>。我尽量避免后者。

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

I want to show a post author's name; <% @post.author.name %> works unless author is nil. So I either use unless @post.author.nil? or add a author_name method that checks for nil as in <% @post.author_name %>. The latter I try to avoid.

The problem is that I may need to add/remove words depending on whether there is a value or not. For instance, "Posted on 1/2/3 by " would be the content if I simply display nil. I need to remove the " by " if author is nil.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清秋悲枫 2024-09-15 09:35:22

空对象模式是避免这种情况的一种方法。在你的课堂上:

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)(如果您能习惯的话)。

Null object pattern is one way to avoid this. In your class:

def author
  super || build_author
end

This way you will get an empty author no matter what. However, since you don't actually want to have an empty object sometimes when you do expect nil, you can use presenter of some kind.

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

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

Another way is using try, as in @post.author.try(:name), if you can get used to that.

铜锣湾横着走 2024-09-15 09:35:22

您可以使用 try

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

它将尝试如果它非零,则调用 @post.author 上的 name 方法。否则将返回 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) %>

You can use try:

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

It will attempt to call the name method on @post.author if it is non-nil. Otherwise it will return nil, and no exception will be raised.


Answer to your second question: In principle there is nothing wrong with the following:

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

or

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

But if this is a recurring pattern, you might want to write a helper method for it.

# 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) %>
我偏爱纯白色 2024-09-15 09:35:22

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

Write a method which accepts any variable and checks to see if it is nuil first, and if it is not displays it. Then you only have to write one method.

分开我的手 2024-09-15 09:35:22

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

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

I found your question interesting as I have often come across similar situations, so I thought I'd try out making my first Rails plugin.

I'm afraid I haven't put in any tests yet but you can try it out http://github.com/reubenmallaby/acts_as_nothing (I'm using Ruby 1.9.1 so let me know if you get any problems in the comments or on Github!)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文