无方法错误对于我的时间表控制器的数组的stringify_keys的未定义方法

时间:2013-06-11 18:04:27

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

此处,用户通过选择开始日期和结束日期来提交一段时间的时间表。这些参数被分配给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。* FROM users WHERE   usersid = 2 LIMIT 1 [0m已完成500内部服务器错误3ms

     

NoMethodError(未定义方法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

1 个答案:

答案 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的子类并不是一个重要的区别。