有没有办法避免erb文件中的上下文切换

时间:2011-04-29 20:05:27

标签: ruby-on-rails erb

新手来自Microsoft MVC3 + razor。

说我有:

<% if foo %>
   <%= bar %>
<% end %>

我有办法吗?

<% if foo
   magic_function_that_goes_to_output_buffer bar
end %>

这个功能是否存在?

编辑: 为了绝对清楚,我正在寻找一个我可以在&lt; %%&gt;内多次使用的解决方案。块。在&lt;%=%&gt;之间找到解决方案块只会改变问题。

“不”的答案是可以接受的,因为我可以不再为它烦恼而继续前进。

接受解决方案: 我的application_helper看起来像

    def out(content)
    @output_buffer.safe_concat(content)
end

我的观点看起来像

    prevReview = nil 
@review.each do |review|
    out render :partial => 'review', 
               :locals => { :review => review, :showDate => (prevReview.nil? ? true : prevReview.updated_at === review.updated_at) } 
    prevReview = review
end

3 个答案:

答案 0 :(得分:1)

确实如此,试试这个:

<%= bar if foo %>

编辑:

你也可以这样做:

<%= if true 
 "true"
else
 "false"
end %>

但是如果你涉及很多逻辑,你应该更好地使用帮助器。所以在你帮助文件中:

def magic_function_that_goes_to_output_buffer(condition)
  if condition
    "true"
  else
    "false"
  end
end

在您看来:

<%= magic_function_that_goes_to_output_buffer(foo) %>

答案 1 :(得分:1)

是的,有办法。

但在我说出来之前,请不要这样做,除非你有充分的理由。这是因为您将被绑定到可能随时更改的实现细节。

只需发布针对您特定问题的新问题,您肯定会得到很好的答案。

这是:

<% if foo
     @output_buffer.concat("any string will do")
     bar = call_what_you_want
     @output_buffer.concat(bar.to_s)
   end
%>

好的,这在Rails 2.x上运行良好但是使用Rails 3你会连接到一个安全的输出缓冲区,所以你应该在@output_buffer变量上调用#safe_concat而不是#concat。

答案 2 :(得分:0)

也许你想看看haml。 haml代码看起来更干净,更时尚。

  <% if foo %>
       <%= bar %>
    <% end %>

此erb代码转换为:

 - if foo
   = bar

这就是全部。几个有用的链接haml sitehaml-rails plugin page。祝你好运!