我有一个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) %>
可读性较差,并隐藏了渲染的意图。我可以建议一些可能的改进,而不是将逻辑隐藏在该方法中。
您仍然可以将行减少到
<%= render @post if @post %>
nil
对象的计算结果为 false。其他改进是捕捉到
@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)