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 %>

Any reason you cant do that?

edit: If you want to manipulate them, define it in the model.

def modify_attr0
    attr0.to_s+" foo"
end

In the view

myclass.modify_attr0
于 2013-05-28T16:11:46.297 に答える