15

datetime_select フィールドを持つ Rails フォームがあります。フォームを送信しようとすると、次の例外が発生します。

ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update 
1 error(s) on assignment of multiparameter attributes

検証エラーの場合、ページにエラーが表示されないのはなぜですか?

これはRails 2.0.2にあります

4

7 に答える 7

11

Rails は、マルチパラメーター割り当てと呼ばれるものを使用して、パラメーターをモデル インスタンスに割り当てたときに再構築される小さなパーツで日付と時刻を送信することがわかりました。

私の問題は、日付モデル フィールドに datetime_select フォーム フィールドを使用していたことです。マルチパラメータ マジックが Date オブジェクトに時刻を設定しようとすると、明らかにチョークします。

date_select解決策は、ではなくフォーム フィールドを使用することでしたdatetime_select

于 2008-09-18T14:57:42.030 に答える
5

スーパーハックですが、クライアントプロジェクトのためにこの問題をすぐに解決する必要がありました. これはまだ Rails 2.3.5 のバグです。

date_selectまたはのいずれかを使用してdatetime_select、これをメソッドのモデルに追加するとinitialize、渡されたフォーム シリアル化された属性を事前に解析して機能させることができます。

def initialize(attributes={})
  date_hack(attributes, "deliver_date")
  super(attributes)
end

def date_hack(attributes, property)
  keys, values = [], []
  attributes.each_key {|k| keys << k if k =~ /#{property}/ }.sort
  keys.each { |k| values << attributes[k]; attributes.delete(k); }
  attributes[property] = values.join("-")
end

ネストされたポリモーフィックなモデルでこれを使用しています。 これは、私が使用しているモデルを示す質問です。だから私accepts_nested_attributes_forは日時が必要でした。

コンソールを使用した入力と出力は次のとおりです。

e = Event.last
=> #<Event id: 1052158304 ...>
e.model_surveys
=> []
e.model_surveys_attributes = [{"survey_id"=>"864743981", "deliver_date(1i)"=>"2010", "deliver_date(2i)"=>"2", "deliver_date(3i)"=>"11"}]
PRE ATTRIBUTES: {"survey_id"=>"864743981", "deliver_date(1i)"=>"2010", "deliver_date(2i)"=>"2", "deliver_date(3i)"=>"11"}
# run date_hack
POST ATTRIBUTES: {"survey_id"=>"864743981", "deliver_date"=>"2010-2-11"}
e.model_surveys
=> [#<ModelSurvey id: 121, ..., deliver_date: "2010-02-11 05:00:00">]
>> e.model_surveys.last.deliver_date.class
=> ActiveSupport::TimeWithZone

それ以外の場合は null であるか、エラーがスローされます。

1 error(s) on assignment of multiparameter attributes

お役に立てば幸いです、ランス

于 2010-02-11T18:08:30.377 に答える
3

これは Rails のバグではなく、マルチパラメーター属性ライターの意図した動作です。データベース内の元のポスターのdeliver_dateフィールドは、日付または日時型ではなくvarcharであると確信しています。ActiveRecord は、マルチパラメーター属性の各部分を使用して、シリアル化された型の新しいメソッドに送信します。1、2、3 などの数字はコンストラクターのパラメーターの位置を示し、"i" はコンストラクターに渡す前にパラメーターで to_i を呼び出すように ActiveRecord に指示します。この場合、DateTime.new(年、月、日) は 3 つの文字列ではなく 3 つの整数を想定しているため、それらはすべて「i」です。

データベースの deliver_date 列が DateTime にシリアル化された型でない場合、ActiveRecord は ActiveRecord::MultiparameterAssignmentErrors 例外をスローします。これは、String.new(2010,2,11) が成功しないためです。

ソース: https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739

于 2011-02-11T01:46:52.660 に答える
2

モデル属性に無効な日付を設定しようとすると、ActiveRecord は MultiparameterAssignmentErrors 例外をスローします。

date_select または datetime_select ドロップダウンから 11 月 31 日の日付を選択しようとすると、このエラーが発生します。

于 2009-12-09T04:39:34.603 に答える
1

Zubin のように、フォームが月を数値の月の文字列ではなく月の名前として送信する場合 (たとえば、10 ではなく 10 月)、この例外を見てきました。

私が遭遇した 1 つのユーザー エージェントは、value 属性ではなくオプション タグの内容を送信しているようです。

Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/300.21.012; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (Gecko のような KHTML) Safari/413

したがって、ヘルパーが生成した (date_select ヘルパーからの) select から複数パラメーターの日付を送信する場合、パラメーターは次のようになります。

"event"=> {
    "start_on(2i)"=>"October",
    "start_on(3i)"=>"19",
    "start_on(1i)"=>"2010"
}

これにより、例外が作成されます: ActiveRecord::MultiparameterAssignmentErrors: マルチパラメータ属性の割り当てに関する 1 エラー

ほとんどのユーザー エージェントは正しく送信します:

"event"=> {
    "start_on(2i)"=>"10",
    "start_on(3i)"=>"19",
    "start_on(1i)"=>"2010"
}
于 2010-10-17T09:50:21.240 に答える
0

このエラーは、テーブルを使用してフォーム データを入力するときに webrat/cucumber でも発生する可能性があります。

たとえば、これは機能しません:

When I fill in the following:
  | report_from_1i | 2010     |
  | report_from_2i | January  |
  | report_from_3i | 1        |
  | report_to_1i   | 2010     |
  | report_to_2i   | February |
  | report_to_3i   | 1        |

しかし、これは:

When I fill in the following:
  | report_from_1i | 2010 |
  | report_from_2i | 1    |
  | report_from_3i | 1    |
  | report_to_1i   | 2010 |
  | report_to_2i   | 2    |
  | report_to_3i   | 1    |
于 2010-02-08T20:48:47.403 に答える
0

私の場合、ActiveRecord am/pm プラグインが原因でエラーがalias_method_chain発生し、StackLevelTooDeep例外が発生しました。

このプラグインは unobtrusive_date_picker プラグインに含まれていました。

ハッキングする前にこれを調べてください。

于 2010-05-04T13:49:36.170 に答える