0

班级MyClass

class MyClass < ActiveRecord::Base

  attr_accessible :attr0, :attr1 

end

控制器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,但我必须先调用以循环浏览 MyClass 的实例。我上面所做的一切都没有在我看来。有没有一种优雅的方法可以在我的方法 set_var 中不处理 html 代码?var1set_varset_var(myclass)


编辑:

如下所述,这不是一个选项,因为我的示例非常简化

 <% @myclasses.each do |myclass| %>
   <tr>
     <td><%= myclass.attr0 %></td>
     <td><%= myclass.attr1 %></td>
   </tr>
<% end %>
4

2 回答 2

1

@myclasses如上所述,它不是控制器实例变量,而是类本身的实例变量。要@myclasses在视图中使用符号,它需要是一个实例变量:

class MyController < ApplicationController
  def some_method
    @myclasses = MyClass.all
  end
end

除此之外,我不喜欢你在做什么。似乎您应该直接访问属性,使用模型方法,使用装饰器,甚至是常规助手。


在问题编辑为正确后进行编辑。

实例变量在预渲染中暴露;那时,即时创建的新产品将不可用。您可以尝试在您的操作中初始化它们并修改它们,但是很糟糕。

您在这里以一种非常可怕的方式混淆了关注点:无论此方法需要在装饰器或模型等中,在循环中回调控制器以修改每次迭代的实例变量都必须被视为所有方面的反模式。

于 2013-05-28T16:13:34.437 回答
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
于 2013-05-28T16:11:46.297 回答