没有方法错误未定义的方法为我的时间表控制器数组的stringify_keys



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

我得到这个错误时,建立时间表为特定的日子:

开始"/用户/2/工时表/构建? start_date = 06/08/2013& end_date = 06/11/2013"于2013年6月11日23:24:23 +0530进行处理TimesheetsController#build as /参数:{"end_date"=>"06/11/2013"、"start_date"=>"06/08/2013"、"user_id"=>"2"}[1m] 36mUser Load (0.1ms)[0m] 1mSELECT users .* FROM users WHERE .users。在3毫秒内完成500个内部服务器错误

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

我猜你正在使用Ruby 1.8,其中Hash#select返回一个数组:

选择{键值| |块}=>阵列

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

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

Timesheet.new(timesheet_params)

和AR将尝试使用stringify_keys方法将期望成为哈希的键转换为字符串,Rails将timesheet_params补丁为哈希,一切都崩溃了,因为CC_11实际上是一个数组。这至少符合你所看到的行为。

解决方案是不使用params.select,只是使用slice方法,Rails添加到哈希:

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

新版本的Ruby中的Hash#select方法返回一个Hash。而且1.8版本相当老旧,所以如果可能的话你应该尽快升级。


:是的,params实际上是一个activessupport::HashWithIndifferentAccess,但子类Hash和很少是一个重要的区别。

最新更新