2011-10-12 10 views
4

I次のルートを持っている:force_sslがリダイレクトでparamsを破壊しないようにするにはどうすればいいですか?

resources :widgets do 
    resources :orders 
end 

よう要求、例えば/widgets/1/orders/newはOrderControllerに行き、params[:widget_id]にアクセスして購入しているウィジェットを知ることができます。

問題はこれです:私はforce_sslをOrderControllerで使用します。これは、要求を引き起こしている:

http://www.example.com/widgets/1/orders/new 

をリダイレクトする(302)へ:つまり

https://www.example.com/ 

、FORCE_SSLは(httpsにURLのプロトコルバージョンをリダイレクトする)その仕事をしているが、破壊されますプロセス内のルートの動的セグメントによって指定されたパラメータ。これを防止するにはどうすればよいですか(推奨)

これはHerokuでホストされていることに注意してください。 Apacheのリダイレクトは私のためには機能しません。

答えて

3

force_sslのデフォルトの動作は、非セキュア接続からセキュリティ保護された接続にパラメータを渡すことです。これがあなたが望む動作ではない場合、そのようなイニシャライザを追加してforce_ssl関数をオーバーライドすることができます:

# 
# Pass parameters in SSL redirects 
# 
module ActionController 
    module ForceSSL 
    module ClassMethods 
     def force_ssl(options = {}) 
     host = options.delete(:host) 
     before_filter(options) do 
      if !request.ssl? && !Rails.env.development? 

      secure_params = request.params.clone 
      [:only, :except, :protocol, :status, :host].each {|s| secure_params.delete(s)} 

      redirect_options = {:protocol => 'https://', :status => :moved_permanently} 
      redirect_options.merge!(:host => host) if host 
      redirect_to redirect_options.merge(secure_params) 
      end 
     end 

     end 
    end 
    end 
end 
+0

この回答に感謝します。残念なことに、私はそれ以来、SSLをアプリ全体に強制して展開してきました(つまり、config/environments/production.rbの 'config.force_ssl = true')。私はプロダクションサーバでこれを実行せずに簡単にテストすることができないので、あなたのソリューションがうまく動作するかどうかはわかりません。 : - \ – niemand

+0

私のために働く、ありがとう!これに対してプルリクエストを作成しましたか? – jankubr

+0

ありがとうございます!あなたは本当に私を救った! – Pabloks

関連する問題