【问题标题】:Rails - "can't convert Symbol into String" on Production ONLYRails - 仅在生产中“无法将符号转换为字符串”
【发布时间】:2011-02-09 16:21:48
【问题描述】:

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

app/views/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 方法只需获取密钥并使用简单的正则表达式检查特定前缀。它位于

app/helpers/mymodelhelper.rb

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

这在我的开发和测试环境中运行良好。一旦它进入 Heroku,我就会收到一条错误消息,指出 (ActionView::Template::Error) “无法将符号转换为字符串”,指向对 match 的调用。

如果我从视图中删除对myModelFlash 的调用并简单地显示键和值,那么就不会出错而言效果很好,所以至少键和值只是进入部分视图美好的。出于某种原因,辅助方法认为传递给它的键是符号而不是字符串。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您应该比较 ruby​​ 的版本和您正在使用的所有 gem。如果您使用“捆绑器”,那么“捆绑列表”会给出很好的总结。

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

    更新

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

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

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

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

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

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

    在您的测试中,将其他几个键添加到您的闪存中,然后测试操作如何处理它们。

    【讨论】:

    • 我曾在辅助方法中尝试过 key.to_s,但结果字符串为空且匹配失败。在将密钥传递给助手之前,我会先尝试 to_s,看看会发生什么。
    • 因此,您的闪存包含不同的数据。尝试在生产服务器上调试闪存的内容,并在测试中使用此值。在这种情况下,问题可能与组件的版本无关。
    • 使用model_key = myModelFlash(key.to_s) 有效,尽管如前所述,这是一种解决方法。稍后我会检查 ruby​​/gem 版本,看看我能想出什么。
    • 我相信在.match(key.to_s)中使用.to_s会更好。被调用的函数应该“按摩”属性,而不是调用者。为了调试问题...好吧,这可能会很长,所以我会更新答案,我们有更多的地方。
    • 感谢@Arsen7 的精彩更新。我想我从不认为键值是字符串或符号以外的任何东西,并假设符号上的 to_s 可以在这里工作。感谢您的纠正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多