当“render”在 Rails 中具有参数“nil”时,如何抑制错误



我有一个render方法可以像这样调用部分模板:

<%= render @post if @post.present? %>

有没有办法这样写?

<%= method_like_try(:render, @post) %>

这样我就不需要检查@post的存在.

如果它不是在Ruby或Rails中实现的,我将坚持第一种风格。

您可以在application_helper.rb中定义它:

def method_like_try(method, object)
  send(method, object) if object.present?
end

但是你应该选择一个好的名字,让你的第一行一样可读。

老实说,没有错

<%= render @post if @post.present? %>

已经很简洁了。任何缩短它的尝试都会有效地引起相反的效果。

<%= method_like_try(:render, @post) %>

可读性较差,并隐藏了渲染的意图。我可以建议一些可能的改进,而不是将逻辑隐藏在该方法中。

  1. 您仍然可以将行减少到

    <%= render @post if @post %>
    

    nil对象的计算结果为 false。

  2. 其他改进是捕捉到@post之前为零的事实。例如,@post从哪里来?如果是 show 操作,则可以轻松地使用 bang-方法 在值为 nil 时引发异常。或者您可以使用之前过滤器

    class MyController
      before_filter :find_post
      def show
        render @post
      end  
      def find_post
        @post = Post.find_in_someway
        @post or head(404)
      end
    end
    

不,没有像第二个选项这样的版本。第一个可能是更好的选择,因为它也更具可读性和清晰度

试试这个

render @posts || (nothing: true)

最新更新