【发布时间】:2011-01-23 12:07:46
【问题描述】:
我不确定我是否在这里采用了最好的方法,但我有一个数据块,我想在搜索完成后显示并且之前根本不存在。首先,没有什么可显示的,其次它引用的模型是 nil 所以它会抛出异常。
我将此块放置在部分模板中,并将其添加到布局中的适当位置。有没有办法干净地有条件地渲染部分?有没有更好的方法来解决这个问题?
【问题讨论】:
标签: ruby-on-rails ruby partial-views
我不确定我是否在这里采用了最好的方法,但我有一个数据块,我想在搜索完成后显示并且之前根本不存在。首先,没有什么可显示的,其次它引用的模型是 nil 所以它会抛出异常。
我将此块放置在部分模板中,并将其添加到布局中的适当位置。有没有办法干净地有条件地渲染部分?有没有更好的方法来解决这个问题?
【问题讨论】:
标签: ruby-on-rails ruby partial-views
一种简单的方法是使用辅助方法。助手往往比将逻辑直接放在视图中更干净。
所以,你的观点可能是这样的:
<%= render_stuff_conditionally %>
你的助手会有一种方法来控制它:
def render_stuff_conditionally
if @contional_check
render :partial => 'stuff'
end
end
显然事物的命名更恰当
【讨论】:
假设我没听错,你在视图级别执行此操作。
<% if !@my_search_data.nil? %>
<% render :partial => 'foo/bar' %>
<% end %>
希望对您有所帮助。如果没有,也许发布您的代码示例。
【讨论】:
Ruby 允许你做这样的好事:
<%= render :partial => "foo/bar" if @conditions %>
为了便于阅读和理解,可以写成:
<%= render(:partial => "foo/bar") if @conditions %>
render 是一个函数,你向它传递一个哈希值,告诉它要渲染哪个部分。 Ruby 允许您将内容放在一行中(这通常使它们更易读和更简洁,尤其是在视图中),因此if @conditions 部分只是一个常规的 if 语句。也可以这样做:
<% if @conditions %>
<%= render :partial => "foo/bar" %>
<% end %>
编辑:
Ruby 还允许您使用unless 关键字代替if。这使代码更具可读性,并让您不必进行否定比较。
<%= render :partial => "foo/bar" if !@conditions %>
#becomes
<%= render :partial => "foo/bar" unless @conditions %>
【讨论】:
<%= render :partial => "foo/bar" unless @conditions %> 是我正在寻找的简洁性。而且,关于您在下面的评论,我同意完全教条化关注点分离是愚蠢的。这实际上是我喜欢 Rails 模板灵活性而不是像 Django 这样的系统的原因。但我确实喜欢尽可能限制它。我猜是我做经典 asp 的噩梦般的回忆。感谢您的帮助!