【问题标题】:ActionDispatch::Http::Parameters#encode_params tries to modify frozen strings and raises on upgrade from Rails 3.0 to Rails 3.2.16ActionDispatch::Http::Parameters#encode_params 尝试修改冻结的字符串并在从 Rails 3.0 升级到 Rails 3.2.16 时引发
【发布时间】:2014-01-08 11:08:14
【问题描述】:

基本上,这似乎是一年前一个停止回复的人报告的https://github.com/rails/rails/issues/7725(呵呵http://xkcd.com/979/

当我从最后一个 Rails 3.0 升级到 Rails 3.2.16 时,我得到了这个。

有问题的路由提供来自模型Page 的HTML,例如/en/contact 形式的路由(来自config/routes.rb

# pages
STATIC_PAGES.each do |slug, desc|
  match ":language/#{slug}" => 'pages#static_page', :defaults => {:slug => slug, :language => 'en'}, :via => :get, :as => slug.underscore.to_s
end

我尝试制作一个执行相同操作并中断的示例应用程序失败了(将应用程序的相关部分复制到一个新应用程序中,复制了 GemfileGemfile.lock 并尝试重现,一切正常)

这是堆栈跟踪:https://gist.github.com/bbozo/8315184 - 我的应用中没有一行代码

再说一次,这是一个鬼问题,如果有人有预感在哪里寻找它,你会让我非常高兴

:-/

【问题讨论】:

  • 对于投了反对票的人,请告诉我要解决的问题,tia

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


【解决方案1】:

从哈希迭代器中复制密钥为我修复了它,

# pages
STATIC_PAGES.each do |slug, desc|
  match ":language/#{slug}" => 'pages#static_page', :defaults => {:slug => slug.dup, :language => 'en'}, :via => :get, :as => slug.underscore.to_s
end

这里的问题是STATIC_PAGES 是一个带有String 键的哈希常量,它的键被冻结了。在路由默认值在路由器中启动的请求的情况下,尝试对存储在:defaults => {:slug => slug 中的冻结slug 字符串执行某些操作-rails 3.0 => rails 3.2.16 更改日志中的某些内容引入了对此值的修改和闪亮的异常发生在 ActionDispatch 堆栈中。

“解冻”slug 通过执行slag.dup 修复了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多