【问题标题】:No method Error Undefined method for stringify_keys for array for my time-sheet controller没有方法错误我的时间表控制器的数组的 stringify_keys 未定义方法
【发布时间】:2013-06-11 18:04:27
【问题描述】:

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

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

开始 GET “/users/2/timesheets/build?start_date=06/08/2013&end_date=06/11/2013” 127.0.0.1 于 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.id = 2 LIMIT 1[0m Completed 500 Internal Server Error in 3ms

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

【问题讨论】:

  • 看起来 timesheet_params 是数组,而 Timesheet.new 要求哈希
  • @tlewin:Ruby 1.8 会发生这种情况,但 1.9+ 不会发生这种情况

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


【解决方案1】:

我猜你使用的是 Ruby 1.8 Hash#select returns an Array:

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

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

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

Timesheet.new(timesheet_params)

AR 将尝试使用 stringify_keys 方法将什么-it-expects-to-be-a-Hash 键转换为字符串,Rails 将其修补为 Hash,然后一切都崩溃了,因为 timesheet_params 实际上是一个数组。这至少与您看到的行为相符。

解决办法是根本不使用params.select,直接使用Rails添加到Hash的slice方法即可:

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多