4

我有部分视图,显示模型特定的flash消息。部分看起来像:Rails - “无法将符号转换为字符串”仅适用于生产

应用/视图/为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方法简单地取密钥,并检查用于使用简单的regex一个特定前缀。它位于

应用程序/佣工/ mymodelhelper.rb

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

此作品在我的开发和测试环境完美的罚款。一旦它进入Heroku,我收到一个错误(ActionView :: Template :: Error)“无法将符号转换为字符串”,指向match的调用。

如果我从视图中删除了对myModelFlash的调用,并且只显示了键和值,那么在没有错误输出方面工作得很好,所以至少键和值正在进入局部视图中就好了。由于某种原因,助手方法认为传入的键是符号而不是字符串。

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

回答

3

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

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

你应该比较红宝石的版本和你正在使用的所有宝石。如果您使用“捆绑器”,那么“捆绑列表”会给出一个很好的总结。

如果你发现所有的版本都是一样的......那么,我们将寻找另一个原因。

更新

,因为它似乎,这个问题是由版本差异没有引起,而是由闪存意外的数据,这显然在生产环境中可能会比在测试不同。

我建议你稍微改变myModelFlash方法。

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

闪光灯可能包含不同的密钥,其中一些可能是符号或真的没有什么东西,所以你必须准备应付他们。

.to_s转换的key参数应该是一个安全的选择,但如果你确信你总是设置闪光灯键(我的意思是与此相关的“_mymodel”问题上的键)作为字符串,你可以改变第一线这种方法:

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

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

+0

我试过了钥匙。to_s在辅助方法中,但结果字符串为空,并且匹配失败。在将密钥传递给帮助者之前,我会尝试to_s,看看会发生什么。 – 2011-02-09 16:40:26