Rails - 仅在生产时“无法将符号转换为字符串”

时间:2011-02-09 16:21:49

标签: ruby-on-rails regex ruby-on-rails-3 production-environment

我有部分视图,显示特定于模型的Flash消息。部分看起来像:

应用/视图/为MyModel / _flashpartial.erb

<% flash.each do |key, value| %>
  <% if model_key = myModelFlash(key) then %>
    <%= content_tag(:div, value, :class => "flash #{model_key}") %>
  <% end %>
<% end %>

myModelFlash方法只需使用密钥并使用简单的正则表达式检查特定前缀。它位于

应用/助手/ mymodelhelper.rb

module MyModelHelper
  def myModelFlash( key )
    m = /^_mymodel_(.*)/.match(key)
    m[1] unless m.nil?
  end
end

这在我的开发和测试环境中完美无缺。一旦它进入Heroku,我得到一个错误说(ActionView :: Template :: Error)“无法将符号转换为字符串”,指向对match的调用。

如果我从视图中删除了对myModelFlash的调用,只显示了键和值,那么就没有错误输出就可以了,所以至少键和值都会进入局部看起来很好。由于某种原因,辅助方法认为传入其中的密钥是符号而不是字符串。

关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:3)

我建议您使用key.to_s作为快速解决方法。

您遇到问题的原因可能是某些组件的某些版本在您的测试服务器和生产服务器之间存在差异。 如果您的测试通过,并且您的生产环境崩溃,那就是非常糟糕的情况。

您应该比较ruby的版本和您正在使用的所有宝石。如果您使用'bundler',那么'bundle list'会给出一个很好的总结。

如果您发现所有版本都相同......那么,我们将寻找其他原因。

<强>更新

因为看起来问题不是由版本差异引起的,而是由闪存中的意外数据引起的,这显然在生产环境中可能与测试中的不同。

我建议您稍微更改myModelFlash方法。

def myModelFlash( key )
  if m = /^_mymodel_(.*)/.match(key.to_s)
    return m[1]
  end
end

闪存可能包含不同的密钥,其中一些可能是符号或任何东西,因此您必须准备好处理所有密钥。

使用key转换.to_s参数应该是一个安全的选择,但如果您确定始终将闪存键(我的意思是与此“_mymodel”问题相关的键)设置为字符串,您可以更改此方法的第一行:

def myModelFlash( key )
  if key.is_a?(String) && m = /^_mymodel_(.*)/.match(key.to_s)
    return m[1]
  end
end

在测试中,在闪存中添加一些其他键,然后测试操作如何处理它们。