0

在这里,用户通过选择开始日期和结束日期来提交某个时间段的时间表。这些参数被分配给 timesheet_params 然后它被传递给时间表模型。

在为特定日期构建时间表时出现此错误:

开始 GET "/users/2/timesheets/build?start_date=06/08/2013&end_date=06/11/2013" for 127.0.0.1 在 Tue Jun 11 23:24:23 +0530 2013 由 TimesheetsController#build as / 参数处理: {"end_date"=>"06/11/2013", "start_date"=>"06/08/2013", "user_id"=>"2"} [1m[36mUser Load (0.1ms)[0m [1mSELECT users.*users从哪里来 usersid= 2 LIMIT 1[0m 在 3ms 内完成 500 内部服务器错误

NoMethodError(未定义stringify_keys' for #<Array:0xb23ed8f4>):app/controllers/timesheets_controller.rb:23:in的新方法'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

我猜你正在使用 Ruby 1.8,它Hash#select返回一个 Array

选择{|键,值| 块} => 数组

[key,value]返回一个由块返回的对组成的新数组true

这意味着你timesheet_params实际上是一个数组。然后将该数组交给 ActiveRecord:

Timesheet.new(timesheet_params)

并且 AR 将尝试使用 Rails 将其修补为 Hash 的方法将预期的哈希键转换为字符串stringify_keys,然后一切都崩溃了,因为timesheet_params它实际上是一个数组。这至少符合您所看到的行为。

解决办法是根本不用params.select,直接用sliceRails加Hash的方法:

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

Hash#select较新版本的 Ruby 中的方法返回一个 Hash。1.8 也很古老,所以如果可能的话,你应该尽快升级。


对于学究:是的,params实际上是ActiveSupport::HashWithIndifferentAccess但它是 Hash 的子类并且很少是重要的区别。

于 2013-06-11T19:14:07.660 回答