【问题标题】:Rails Try MethodRails 尝试方法
【发布时间】:2014-06-14 19:08:23
【问题描述】:

我的模型是 Ticket、Staff、Post。

门票属于员工
员工 has_many Posts

我有 Ticket 实例 @ticket。
我想呈现与票证相关的所有帖子。
如果没有相关帖子,将显示“没有可用帖子”消息。
我的版本很冗长:

if @ticket.staff and @ticket.staff.posts
  render @ticket.staff.posts
else 
  There are no answers available

但我想做一些更整洁的事情。

= render(@ticket.staff.try(:post).any?) || "There are no answers available"

它给了我一个错误 'nil' 不是 ActiveModel 兼容的对象。它必须实现 :to_partial_path。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails rendering


    【解决方案1】:

    在您的票证模型中,您可以“委托”

    delegate :posts, to: :staff, allow_nil: true
    

    在控制器中创建一个实例变量。

    @posts = ticket.posts
    

    在你看来

    -if @post.present?
      =render @posts
    -else
      There are no answers available
    

    【讨论】:

    • 你不觉得它比我的版本更冗长吗?
    • 对我来说,在 Rails 中它是关于可读性的。有时可读性意味着不那么冗长,但在这种情况下,它意味着遵守 demeter 法则,仅将视图元素放在视图中,将控制器元素放在控制器中,等等。最后,视图更简单,只需要代码。而且您可能会在其他地方使用ticket.posts,这样以后您的整个项目就会变得不那么冗长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2012-06-30
    • 2013-02-07
    • 1970-01-01
    • 2019-02-05
    • 2014-03-26
    相关资源
    最近更新 更多