4

select_dateヘルパーメソッドで使用しようとする場合を除いて、通常は正常に機能する日付にattr_accessorを使用しようとしています。

ヘルパー メソッドの背後にあるコードを見ると、日付型のテーブル列を探していると思います。この場合、テーブルがないため、正しく処理されず、次のようになります。

ActiveRecord::MultiparameterAssignmentErrors

"search"=>{"number_of_days"=>"3",
 "searchable_id"=>"6933",
 "startdate(1i)"=>"2011",
 "startdate(2i)"=>"2",
 "startdate(3i)"=>"11"}}

これを回避する方法はありますか?または、コントローラーで何らかの前フィルターを作成する必要がありますか? モデル レベルで実行したいのですが、この場合の処理​​方法がわかりません。それぞれの attr_accessor は少しやり過ぎのようです。他の誰かがエレガントなソリューションを持っていますか?

4

4 に答える 4

3

attr_accessor フィールドは、通常、モデルを保存/更新するときに保存されません。どのようにモデルを更新していますか?

また、次のように startdate パラメータを日付オブジェクトに変換できます。

@start_date = Date.civil(params[:search][:"startdate(1i)"].to_i,params[:search][:"startdate(2i)"].to_i,params[:search][:"startdate(3i)"].to_i)

ここをチェック

于 2011-02-11T17:59:24.903 に答える
0

select_dateモデルフィールドに関連付けられていないドロップダウンを作成するためのものです(反対側でドロップダウンを取得して、必要な操作を実行できるという考えで)。私はあなたがdate_selectモデルから逃げるという意味だと思いますか?

いずれにせよ、私が知る限り、簡単に言えば、これを機能させるための素晴らしい方法はありません。これは、ヘルパーの動作方法ではなく、アクティブレコードがこれらの属性を処理する方法が複数のパラメーターに分割されているためです。

興味がある場合はもう少し詳しく説明しますが、これが簡単に機能しない理由は、Active Recordが渡されたパラメーターを処理しているときexecute_callstack_for_multiparameter_attributesに、「」に分割されたキーを解釈するためです。 date(1i) "スタイルで、適切なクラス(日付または時刻オブジェクト)にそれらを変更します。日付または時刻を作成する必要があるかどうかを判断する方法は、属性のタイプと照合することです(ここを参照)が、「startdate」属性は特定のタイプにバインドされていないため、取得されませんdbではdateまたはdatetime列として扱われます。

@ Phyo-Wai-Winと同様に処理すると思いますがselect_date、「search」名前空間の外部で別のパラメーターを設定し、コントローラーで適切にモデルに渡すために使用します。このように、それは多くの作業ではありません、そしてそれはあなたがレコードを初期化する方法またはそれが期待する属性をいじっていないことを意味します。

于 2011-02-11T20:02:04.913 に答える
0

ここで少し遅れましたが、この問題に遭遇したばかりで、一番の答えが気に入りませんでした。extract_callstack_for_multiparameter_attributesという ActiveRecord ソースのメソッドを見つけました(これは、idlefingers が言及したメソッドとは異なります)

私のモデルには次のメソッドがあります。このメソッドを手動で呼び出していますが、おそらくオーバーライドupdate_attributesして、コントローラーから保存するときに自動的に実行することができます。params 引数は、実際にはコントローラーからの params[:my_model] です。

attr_accessor :submit_from, :submit_to

def set_dates(params)
  dates = extract_callstack_for_multiparameter_attributes(params)

  dates.each_pair do |field, date_array|
    send "#{field}=", Date.new(*date_array)
  end
end
于 2011-06-04T22:47:25.920 に答える