4

モデル固有のフラッシュメッセージを表示するパーシャルビューがあります。以下のような部分的なルックス:Rails - 生産時にSymbolを文字列に変換できません

アプリ/ビュー/ 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方法は、単純に、簡単な正規表現を使用して、特定のプレフィックスのための鍵とチェックを取ります。これは私の開発環境とテスト環境で完全に正常に動作

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

アプリ/ヘルパー/ mymodelhelper.rbに位置しています。 Herokuに行くとすぐに、(ActionView :: Template :: Error) "SymbolをStringに変換できません"というエラーが表示され、matchへの呼び出しが示されます。

myModelFlashへの呼び出しをビューから削除し、単純にキーと値を表示すると、エラーが発生しないという点ではうまくいくので、少なくともキーと値は部分的なビューに入る。何らかの理由でヘルパーメソッドは、キーに渡されるキーがシンボルであり、ストリングではないと考えます。

これはなぜ起こっているのでしょうか?

答えて

3

私はすぐに回避策としてkey.to_sを使用することをお勧めします。

問題の原因は、一部のコンポーネントの一部のバージョンがテストサーバーと運用サーバーで異なることが原因です。 テストが合格し、運用環境がクラッシュした場合、それは非常に悪い状況です。

ルビーと使用しているすべての宝石のバージョンを比較する必要があります。 'bundler'を使用すると、 'bundle list'が素敵な要約を表示します。

すべてのバージョンが同じであることが判明した場合は、もう1つの理由があります。

更新

、問題ではないバージョンの違いによって、しかし、明らかに本番環境でのテストでは異なる場合がありフラッシュの予想外のデータによって引き起こされているようだと。

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 

テストでは、フラッシュにいくつかの他のキーを追加して、アクションがそれらをどのように処理するかをテストします。

+0

私は鍵を試しました。to_sを返しますが、結果の文字列は空であり、一致しませんでした。キーをヘルパーに渡す前にto_sを試し、そこで何が起こるかを見てみましょう。 –

+0

したがって、フラッシュには異なるデータが含まれています。プロダクションサーバー上でフラッシュの内容をデバッグし、テストでこの値を使用してください。この場合、問題はおそらくコンポーネントのバージョンに関係していません。 – Arsen7

+0

'model_key = myModelFlash(key.to_s)'を使うと、うまくいくでしょうが、これは少し問題になります。私は少し後でルビー/宝石のバ​​ージョンをチェックアウトし、私が思いつくことができるものを見ていきます。 –

関連する問題