视图中的输出变量已在控制器中操作

时间:2013-05-28 16:07:28

标签: ruby-on-rails ruby sqlite

班级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中操作后输出var1set_var,但我必须先调用set_var(myclass)来循环浏览MyClass的实例。我上面所做的并没有在我看来。如果没有在我的方法set_var中处理html代码,有没有一种优雅的方法呢?


编辑:

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

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

2 个答案:

答案 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