0

モデルに永続的に存在しないフィールドを持つフォームがあるため、モデルで attr_accessor を使用して使用できるようにしていますが、アクセスしようとすると常に nil が返されます。

フォーム フィールド:

<%= text_field_tag :discount_code, nil, maxlength: "12", class: "span2" %>

コントローラー:

def an_action
   @job = Job.find(session[:job_id])
   @job.some_method
end

モデル:

class Job < ActiveRecord::Base
    attr_accessor :discount_code

    def some_method
        if !self.discount_code.blank?
        do some logic
    end
end

上記のステートメントは、常に nil と評価されるため、実行されません。

フィールドの値は、問題なしのパラメーターとしてコントローラーで使用できます。

discount_code: test50
action: process_payment
controller: jobs

任意のポインタをいただければ幸いです。

4

3 に答える 3

1

実際には、対応するフォーム値をクラスのインスタンスに自動設定できます。しかし、params[:discount_tag] を設定する text_field_tag を使用しましたが、必要なのは param[:job][:discount_tag] でした。

そのためには、次を使用できます。

<%= f.text_field :discount_code, maxlength: 12, class: "span2" %>

これは確かにはるかにエレガントです。

于 2012-06-16T14:01:37.980 に答える
0

私はそれを考え出した。私は単純に、Rails が実際のデータベース フィールド (つまり、form_for(@jobs)) に対して行うように、attr_accesor が対応するフォーム値をクラスのインスタンスに自動設定すると考えました。

コントローラーに以下を追加するだけで済みました。

@job.discount_code = params[:discount_code]

私を正しい軌道に乗せてくれてありがとう。

于 2012-06-16T13:52:08.510 に答える
0

投稿したサンプル コードが実際にモデルに含まれているものである場合、問題は単に discount_code にアクセスしようとしているコンテキストにあります。discount_code 値はモデルのインスタンスでのみ使用できますが、あなたの場合、クラス コンテキストでアクセスしようとしています。

setter メソッドをオーバーライドして、実際に設定されていることを確認できます。

def discount_code=(code)
  # If you get here, then the value is being set!
  super
end
于 2012-06-16T12:50:38.683 に答える