0

私は仮想属性を持つモデルを持っています:

class Campaign < ActiveRecord::Base  
  def status
     if deactivated
       return "paused"
     else
       return "live"
     end
  end
end

今、私の見解では、 で属性にアクセスするとcampaign.status、適切な結果が得られます。ただし、このようにアクセスしようとするとcampaign[:status]、何も返されません。

何故ですか?

4

1 に答える 1

2

[:status] は Ruby の [] メソッドを使用します。「def status」は、ActiveRecord 属性または仮想属性 (attr_reader や attr_accessor など) と間違えてはならないメソッドを定義します。ActiveRecord は [] メソッドをクラスに追加し、object[:attr_name] および object.attr_name (さらには object.attributes[:attr_name]) によってすべての (データベース) 属性にアクセスできるようにします。

これは、obj[:method] が実質的に obj.method と同じである fe Javascript の動作とは異なります。

編集: たとえば、任意の形式で使用する場合は、attr_accessor を使用できるはずです。

<%= form.input :status %>

フォームを送信すると、インスタンス変数 @status が設定されます。保存前または保存後に何かしたい場合は、before_save または after_save フックを呼び出すことができます。

class Campaign < ActiveRecord::Base  
  attr_accessible :status
  attr_accessor :status
  before_save :raise_status

  def raise_status
    raise @status
  end
end

これにより、ステータスの値が送信された値でエラーがスローされます。

お役に立てれば。

于 2013-02-12T23:32:08.807 に答える