2013-06-11 49 views
0

這裏,用戶通過選擇開始日期和結束日期來提交某個時間段的時間表。這些參數被分配給timesheet_params,然後傳遞給時間表模型。無方法錯誤爲我的時間控制器的數組的stringify_keys的未定義方法

建設時間表時特定日子我收到此錯誤:

入門掌握 「/用戶/ 2 /時間表/建設起始日期= 6月8日/ 2013 & END_DATE = 6月11日/ 2013? 「 for 127.0.0.1 at 2 Jun 11 23:24:23 +0530 2013 Processing by TimesheetsController#build as /參數: {」end_date「=>」06/11/2013「,」start_date「=> 「01/06/2013」​​,「user_id」=>「2」} [1m [36m用戶負載(0.1ms)[0m [1mSELECT users。*從users其中 usersid = 2 LIMIT 1 [0米完成500內部服務器錯誤在3ms的

NoMethodError(未定義的方法stringify_keys' for #<Array:0xb23ed8f4>):app/controllers/timesheets_controller.rb:23:in新的 '應用程序/控制器/ timesheets_controller.rb:23:在`構建'

代碼我使用是:

// 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 
+0

哪一行是第23行? –

+1

它看起來像timesheet_params是陣列和Timesheet.new是要求一個哈希 –

+1

@泰爾文:這將發生在Ruby 1.8但不是1。9+ –

回答

1

我要猜你使用Ruby 1.8,其中Hash#select returns an Array

select {| key,value | block} => array

返回由[key,value]組成的新數組,其中塊返回true

這將意味着您的timesheet_params實際上是一個數組。然後你的手該數組的ActiveRecord:

Timesheet.new(timesheet_params) 

和AR將嘗試轉換的東西,它-預計將要-A-哈希鍵使用stringify_keys方法Rails的補丁進入Hash和一切落在琴絃除了因爲timesheet_params實際上是一個數組。這至少與你所看到的行爲相符。

解決辦法是不使用params.select所有,只是使用slice方法Rails添加到哈希:

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

Hash#select方法在Ruby中的較新版本返回一個哈希值。另外1.8是很古老的,所以你應該儘可能地儘快升級。


對於學究:是的,params實際上是一個ActiveSupport::HashWithIndifferentAccess但子類Hash和很少的一個重要區別。

+0

它爲我工作了,謝謝你.... – user2475667

相關問題