班级MyClass
class MyClass < ActiveRecord::Base
attr_accessible :attr0, :attr1
end
controller MyController
class MyController < ApplicationController
helper_method :set_var
def index
@myclasses = MyClass.all
end
def set_var(foo)
@var0 = foo.attr0
@var1 = foo.attr1
end
end
视图
<table>
<thead>
<tr>
<th>Head0</th>
<th>Head1</th>
</tr>
</thead>
<tbody>
<% @myclasses.each do |myclass| %>
<% set_var(myclass) %>
<tr>
<td><%= @var0 %></td>
<td><%= @var1 %></td>
</tr>
<% end %>
</tbody>
</table>
我希望在var0
中操作后输出var1
和set_var
,但我必须先调用set_var(myclass)
来循环浏览MyClass的实例。我上面所做的并没有在我看来。如果没有在我的方法set_var中处理html代码,有没有一种优雅的方法呢?
编辑:
如下所述,这不是一个选项,因为我的例子非常简化
<% @myclasses.each do |myclass| %>
<tr>
<td><%= myclass.attr0 %></td>
<td><%= myclass.attr1 %></td>
</tr>
<% end %>
答案 0 :(得分:1)
@myclasses
不是控制器实例变量,而是类本身的实例变量。要在视图中使用@myclasses
表示法,它需要是一个实例变量:
class MyController < ApplicationController
def some_method
@myclasses = MyClass.all
end
end
除此之外,我不喜欢你正在做的事情;看起来您应该直接访问属性,使用模型方法,使用装饰器,甚至是常规帮助器。
编辑问题后编辑为正确。
实例变量在预渲染时公开;那时即将推出的新版本无法使用。你可以尝试在你的行动中初始化它们并修改它们,但是主要是你好。
你在这里以一种非常可怕的方式混淆了这些问题:无论这种方法需要在装饰器或模型等中,在循环中将返回调用到控制器中以修改实例每次迭代的变量都得被认为是所有计数的反模式。
答案 1 :(得分:0)
<% @myclasses.each do |myclass| %>
<tr>
<td><%= myclass.attr0 %></td>
<td><%= myclass.attr1 %></td>
</tr>
<% end %>
你有什么理由不这样做吗?
编辑:如果您想操纵它们,请在模型中定义它。
def modify_attr0
attr0.to_s+" foo"
end
在视图中
myclass.modify_attr0