此处,用户通过选择开始日期和结束日期来提交一段时间的时间表。这些参数被分配给timesheet_params,然后传递给时间表模型。
在构建特定日期的时间表时出现此错误:
开始GET “/用户/ 2 /时间表/建立起始日期= 6月8日/ 2013&安培; END_DATE = 6月11日/ 2013” for 127.0.0.1 at Tue Jun 11 23:24:23 +0530 2013 Processing by TimesheetsController#build为 / 参数: {“end_date”=>“06/11/2013”,“start_date”=>“06/08/2013”,“user_id”=>“2”} [1m [36mUser Load(0.1ms)[0m [1mSELECT
users
。* FROMusers
WHEREusers
。id
= 2 LIMIT 1 [0m已完成500内部服务器错误3msNoMethodError(未定义方法
stringify_keys' for #<Array:0xb23ed8f4>):app/controllers/timesheets_controller.rb:23:in
新'app / controllers / timesheets_controller.rb:23:在'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
答案 0 :(得分:1)
我猜你正在使用Ruby 1.8 Hash#select
returns an Array:
选择{|键,值| block} =&gt;阵列强>
返回一个由
[key,value]
对组成的新数组,该块返回true
。
这意味着您的timesheet_params
实际上是一个数组。然后将该数组交给ActiveRecord:
Timesheet.new(timesheet_params)
并且AR将尝试使用stringify_keys
方法将所谓的期望为哈希键转换为字符串,该方法将Rails修补为Hash并且因为timesheet_params
是一切而分崩离析实际上是一个数组这至少与你所看到的行为相符。
解决方案是根本不使用params.select
,只需使用Rails为Hash添加的slice
方法:
timesheet_params = params.slice("start_date", "end_date", "user_id")
较新版本的Ruby中的Hash#select
方法返回一个Hash。 1.8也很古老,所以你应该尽快升级。
对于学生:是的,params
实际上是ActiveSupport::HashWithIndifferentAccess,但是Hash的子类并不是一个重要的区别。