【问题标题】:Dealing with nil in views (ie nil author in @post.author.name)处理视图中的零(即@post.author.name 中的零作者)
【发布时间】:2023-04-10 20:15:01
【问题描述】:

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

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

【问题讨论】:

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

标签: ruby-on-rails ruby views null


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以使用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) %>
    

    【讨论】:

    • 我不能使用这个(见我添加的评论)但它会派上用场,谢谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 2016-06-23
        • 2017-03-06
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 2014-05-14
        相关资源
        最近更新 更多