0

ここで、ユーザーは開始日と終了日を選択して、ある期間のタイムシートを送信します。これらのパラメーターは timesheet_params に割り当てられ、タイムシート モデルに渡されます。

特定の日のタイムシートを作成すると、次のエラーが発生します。

開始 GET "/users/2/timesheets/build?start_date=06/08/2013&end_date=06/11/2013" at 127.0.0.1 at Tue Jun 11 23:24:23 +0530 2013 TimesheetsController#build as / Parametersによる処理: {"end_date"=>"06/11/2013", "start_date"=>"06/08/2013", "user_id"=>"2"} [1m[36mUser Load (0.1ms)[0m [1mSELECT] users.*usersどこから users. id= 2 LIMIT 1[0m 完了 500 内部サーバー エラー 3ms

NoMethodError (未定義のメソッドstringify_keys' for #<Array:0xb23ed8f4>):app/controllers/timesheets_controller.rb:23:innew' app/controllers/timesheets_controller.rb:23:in `build'

私が使用しているコードは次のとおりです。

// time sheet  build method //
def build
    @user = current_user
    timesheet_params = params.select{|k,v| ["start_date", "end_date", "user_id"].include?(k) }
    @timesheet = Timesheet.new(timesheet_params)
    @timesheet.placement = @user.active_assignment

    if @timesheet.valid?
      if @timesheet.timesheet_days.blank?
        build_timesheet_days
      end
    else
      render :status => 500 and return
    end
  end
4

1 に答える 1

1

Hash#select配列を返す Ruby 1.8 を使用していると思います。

{|キー、値|を選択 ブロック} =>配列

[key,value]ブロックが を返すペアで構成される新しい配列を返しますtrue

timesheet_paramsこれは、あなたが実際に配列であることを意味します。次に、その配列を ActiveRecord に渡します。

Timesheet.new(timesheet_params)

AR は、Rails がハッシュにパッチを適用する方法を使用して、期待されるハッシュキーを文字列に変換しようとしますが、実際には配列であるstringify_keysため、すべてがバラバラになります。timesheet_paramsそれは少なくともあなたが見ている行動と一致します。

解決策は、まったく使用せず、Rails が Hash に追加するメソッドをparams.select使用することです。slice

timesheet_params = params.slice("start_date", "end_date", "user_id")

Hash#selectRuby の新しいバージョンのメソッドはハッシュを返します。また、1.8 はかなり古いため、可能であればできるだけ早くアップグレードする必要があります。


衒学者の場合: はい、params実際にはActiveSupport::HashWithIndifferentAccess ですが、それは Hash のサブクラスであり、重要な違いになることはめったにありません。

于 2013-06-11T19:14:07.660 に答える