我正在使用Ruby on Rails,需要在我的一个html.erb文件中运行一段Ruby代码。我是这样做的吗?
<% def name %>
<% name = username %>
<%= name %>
或者像这样:
<% def name
name = username %>
<%= name %>
感谢阅读。
答案 0 :(得分:37)
如果您在视图中需要额外的功能,通常会在帮助器中声明这些功能。
对于每个控制器,如果有一个帮助器,它会自动加载。例如,如果你有一个PeopleController,在app/helpers
文件夹中应该有一个people_helper.rb
,它看起来应该是这样的
module PeopleHelper
def name
#do something
username
end
end
另一个非常干净的选择是使用Presenter pattern,但我认为不太常见(不幸的是)。
否则,如果你在erb视图中确实需要多行ruby代码,我试图避免,我更喜欢以下样式:
<%
counter_1 = 0
counter_2 = 1
do_some_more_prep_here
%>
<% @records.each do |rec|%>
<%# do something with the prepped date in each row %>
<% end %>
另外对我来说代码缩进比html缩进更重要,所以我更喜欢像
这样的东西<table>
<% @rows.each do |row| %>
<tr>
<td><%= row.item1 %></td>
<% if row.some_test %>
<td><%= row.item2 %></td>
<% end %>
</tr>
<% end %>
</table>
但我总是非常有兴趣听到这方面的不同意见。
答案 1 :(得分:23)
在ERB文件中定义方法是不常见的,所以我建议不要这样做。
如果您想调用像#each
这样的块,您可以执行以下操作:
<% names.each do |name| %>
<%= name %>
<% end %>
不要忘记<% end %>
。
答案 2 :(得分:-1)
我可以想象有人在一个特定的模板中需要它(没有创建帮助器的点)不重复html标记。也就是说,当得到的html页面有几个类似的html标记块时。但是,它很容易被滥用(不可读的代码)。
<% def f1(a, b, c) %>
test: <%= a %>, <%= b %>, <%= c %>
<% end %>
<% f1(1, 2, 3) %>
<% f1(4, 5, 6) %>