2012-03-19 7 views
1

私はRails 3.1.1を実行していて、奇妙なバグを受けています。開発中(まだそれを使ってプロダクションに進出しようとしていない)、新しく作成したレコードのURLを生成しようとすると、コントローラやメーラーテンプレートでルーティングエラーが発生することがあります。これは、レコードが正常に作成され、レコードのプロパティとは関係がないように見える場合でも発生します(エラーが発生しなかった場合、まったく同じパラメータでレコードを再作成できます。Rails 3時折のルーティングエラー

メーラーのアクションを追加する前に、起こっていることを私が今までに見たことはありませんが、10回に1回も起こるようです。

さらに複雑な要素が1つあります。URLのレコードのIDを難読化するために暗号化手法を使用していますが、それ以外の場合は問題なく動作します。これを行うために、私は議論された方法を適応させましたhere

私はURLがリンクのために時間内に生成されていないようですが、時間を呼んでいます...しかし、それは私には意味がありません。私は競争状態が私がここで心配する必要があったものだとは思わなかった。

ActionController::RoutingError (No route matches {:action=>"show", :controller=>"watch_lists", :id=>#<WatchList id: 195, title: "sfdsfd", created_at: "2012-03-19 05:18:46", updated_at: "2012-03-19 05:18:46", public_list: false>}): 
    app/controllers/watch_lists_controller.rb:72:in `block (2 levels) in create' 
    app/controllers/watch_lists_controller.rb:56:in `create' 

を、ここには、メーラーのテンプレートで発生したときです(とき:これは(電子メールのために呼び出すことはありませんのparamsが生成される)コントローラで発生したときにここで

は私のエラーログですparamsが描画コマンドの前に生成される電子メール)を呼ぶん:

Rendered watch_list_mailer/share_notification.html.erb (3.2ms) 
Completed 500 Internal Server Error in 113ms 

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"watch_lists", :id=>#<WatchList id: 210, title: "sdggsgsg", created_at: "2012-03-19 05:47:17", updated_at: "2012-03-19 05:47:17", public_list: true>}): 
    20:    <% end %> 
    21:   <% end %><br> 
    22:   <br> 
    23:   Here's a link to your WatchList: <%= link_to @wl.title, watch_list_url(@wl) %><br> 
    24:   <br> 
    25:   Enjoy! 
    26:  </p> 
    app/views/watch_list_mailer/share_notification.html.erb:23:in `_app_views_watch_list_mailer_share_notification_html_erb___1391186431365383285_70156615518000' 
    app/mailers/watch_list_mailer.rb:12:in `share_notification' 
    app/controllers/watch_lists_controller.rb:124:in `share_notification' 
    app/controllers/watch_lists_controller.rb:68:in `block (2 levels) in create' 
    app/controllers/watch_lists_controller.rb:63:in `each' 
    app/controllers/watch_lists_controller.rb:63:in `block in create' 
    app/controllers/watch_lists_controller.rb:56:in `create' 

EDIT:さらにテスト時には、これは関係なく、私がメールタスクを含めるかどうかに起こるように見えます。リンクの難読化によって刺激される可能性が最も高いようです。リンクのエンコーディングには関係がある可能性があります(コード内の間違った場所のスラッシュを防ぐためにURIをエスケープする必要があります)。これをさらに調査して報告します。

+0

チェックは?'あなたのインスタンスに対してtrueを返しています。 –

+0

私はそれを解決しました。問題は、暗号化されたIDにスラッシュが含まれていると、URLの難読化が無効なリンクを返すことにありました。レコードが正常に作成されたため、実際には別のIDを持つレコードが作成され、「/」やその他の無効な文字が含まれている可能性のある別の暗号化URLが作成されます。私はこれまでレコードのパスを作成した場所でこれを直接修正しましたが、ビュー内での作業には移行しませんでした。すべての暗号化されたIDのURIエンコーディングを強制することで問題が解決されました。 'URI.escape(self.encrypt(value)、Regexp.new(" [^#{URI :: PATTERN :: UNRESERVED} "))' –

答えて

0

ID暗号化で問題が発生し、時折無効なリンクが作成されました。プロセスの初期段階で十分に早期にその情報を考慮していませんでした。私のモデルでは/ obfuscate.rb

def uri_encrypt(value) 
    URI.escape(self.encrypt(value), Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")) 
end 

libに

`持続していること

def to_param 
    uri_encrypt(id) 
end 
関連する問題