【问题标题】:activerecord-2.3.14 breaks with ruby 1.9.2 ::undefined method `reject' for "4":Stringactiverecord-2.3.14 与 ruby​​ 1.9.2 ::undefined method `reject' for "4":String 中断
【发布时间】:2011-10-25 17:39:51
【问题描述】:
 undefined method `reject' for "4":String 

当我尝试执行@user.update_attributes(params) 时抛出。

参数列表如下

"user"=>{"login"=>"admin", "first_name"=>"Admin", "last_name"=>"Admin", "email"=>"nfsurveytest+admin@neurofocus.com", "location_id"=>"1", "last_login_at_text"=>"Never logged in", "password"=>"", "password_confirmation"=>"", "role_ids"=>"4", "active"=>"true", "is_staff"=>"true"},

错误堆栈如下

/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14   /lib/active_record/associations.rb:1336:in block in collection_accessor_methods'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/base.rb:2918:inblock in assign_attributes'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/base.rb:2914:in each'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/base.rb:2914:inassign_attributes'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/li b/active_record/base.rb:2787:in attributes='
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/base.rb:2671:inupdate_attributes_inside_transaction'
 /home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/transactions.rb:229:in block in with_transaction_returning_status'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/database_statements.rb:136:intransaction'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/transactions.rb:182:in transaction'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/transactions.rb:228:inwith_transaction_returning_status'
/home/narendra/.rvm/gems/ruby-1.9.2-p290@nf_schedule/gems/activerecord-2.3.14/lib/active_record/base.rb:2667:in update_attributes'
/home/narendra/workspace/nf_schedule/app/controllers/users_controller.rb:100:inupdate'

我认为这会中断,因为 ruby​​ 1.9.2 中的字符串不会混合“Enumerable”。 谁能确认这是一个问题还是我遗漏了什么?

https://github.com/rails/rails/issues/3434

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-1.9.2


    【解决方案1】:

    您正在提供一个字符串,其中 ActiveRecord 需要一个数组。您可以使用以下方式重新映射控制器中的违规参数:

    if (params[:user])
      params[:user][:role_ids] = [ params[:user][:role_ids] ]
    end
    

    您还可以调整表单,将字段命名为 role_ids[] 而不仅仅是 role_ids,以便将其作为数组提交。

    【讨论】:

    • 参数由表单提交生成。我希望 activerecord 能够优雅地处理这个问题。像这样在代码中到处打补丁是不好的
    • 您不应该修补 ActiveRecord 来处理错误的表单提交。你不应该以这种方式发送数据,所以令人惊讶的是它一开始就起作用了。
    • 这在 ruby​​ 1.8.7 和 rails 2.3.14 中运行良好。当我迁移到 ruby​​ 1.9.2 时,我遇到了这个问题。我相信对于我正在使用的单选按钮,这就是 rails 的处理方式(所选选项作为字符串发送)。我不确定是否有 rails helper 可以将单选按钮输入格式化为数组元素而不是字符串(例如:role_ids"=>["4"] 而不是 role_ids"=>"4")。那么你认为它仍然是一个糟糕的表单提交还是应该修复单选按钮助手?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多