5

url_for(:back)を使用して、ユーザーのログイン時に前のページに戻るリダイレクトを作成しようとしています。

ユーザーが自分でログインページにアクセスするだけで、正常に機能しました。ただし、ユーザーの認証が必要なページにアクセスしたためにユーザーがログインページにリダイレクトされると、リダイレクトによって、ユーザーが不十分な権限でアクセスを試みる前に、ユーザーがページに戻されます。

ログインコントローラのアクションを変更して、リダイレクトを適切に処理しようとしています。私の計画では、強制リダイレクトが発生したときに使用されるクエリ文字列パラメータ「redirect」を使用する予定です。コントローラでは、そのパラメータが存在する場合、そのURLが使用されます。それ以外の場合は、url_for(:back)が使用されます。それが機能しない場合(HTTP_REFERERがないため)、ユーザーはサイトのホームページにリダイレクトされます。

このロジックを実装することになっているコードスニペットは次のとおりです。

if params[:redirect]
  @url = params[:redirect]
else
  @url = url_for :back
  @url ||= url_for :controller => "home", :action => "index"
end

私が得るエラーは次のとおりです。

UsersController#loginのNoMethodError

#の未定義のメソッド `back_url'

RAILS_ROOT:[あいまい]
アプリケーショントレース| フレームワークトレース| フルトレース

vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `__send__ '
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `polymorphic_url '
vendor / rails / actionpack / lib / action_controller / base.rb:628:in `url_for '
app / controllers / users_controller.rb:16:in `login '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281

vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `__send__ '
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `polymorphic_url '
vendor / rails / actionpack / lib / action_controller / base.rb:628:in `url_for '
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in `send '
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in `perform_action_without_filters '
ベンダー/rails/actionpack/lib/action_controller/filters.rb:617:in`call_filters'
ベンダー/rails/actionpack/lib/action_controller/filters.rb:610:in`perform_action_without_benchmark'
ベンダー/rails/actionpack/lib/action_controller/benchmarking.rb:68:in`perform_action_without_rescue'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure '
ベンダー/rails/actionpack/lib/action_controller/benchmarking.rb:68:in`perform_action_without_rescue'
vendor / rails / actionpack / lib / action_controller / rescue.rb:136:in `perform_action_without_caching '
ベンダー/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in`perform_action'
vendor / rails / activerecord / lib / active_record / connection_adapters / abstract / query_cache.rb:34:in `cache '
vendor / rails / activerecord / lib / active_record / query_cache.rb:8:in `cache '
ベンダー/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in`perform_action'
vendor / rails / actionpack / lib / action_controller / base.rb:524:in `send '
vendor / rails / actionpack / lib / action_controller / base.rb:524:in `process_without_filters '
ベンダー/rails/actionpack/lib/action_controller/filters.rb:606:in`process_without_session_management_support'
vendor / rails / actionpack / lib / action_controller / session_management.rb:134:in `process '
vendor / rails / actionpack / lib / action_controller / base.rb:392:in `process '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:184:in `handle_request '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:112:in `dispatch_unlocked '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:125:in `dispatch '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:in `synchronize '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:in `dispatch '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:134:in `dispatch_cgi '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:41:in `dispatch '
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load_without_new_constant_marking'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:521:in`new_constants_in'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load'
ベンダー/rails/railties/lib/commands/servers/mongrel.rb:64
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require '
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require '
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:153:in`require'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:521:in`new_constants_in'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:153:in`require'
ベンダー/rails/railties/lib/commands/server.rb:49
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require '
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require '
スクリプト/サーバー:3

vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `__send__ '
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:in `polymorphic_url '
vendor / rails / actionpack / lib / action_controller / base.rb:628:in `url_for '
app / controllers / users_controller.rb:16:in `login '
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in `send '
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in `perform_action_without_filters '
ベンダー/rails/actionpack/lib/action_controller/filters.rb:617:in`call_filters'
ベンダー/rails/actionpack/lib/action_controller/filters.rb:610:in`perform_action_without_benchmark'
ベンダー/rails/actionpack/lib/action_controller/benchmarking.rb:68:in`perform_action_without_rescue'
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure '
ベンダー/rails/actionpack/lib/action_controller/benchmarking.rb:68:in`perform_action_without_rescue'
vendor / rails / actionpack / lib / action_controller / rescue.rb:136:in `perform_action_without_caching '
ベンダー/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in`perform_action'
vendor / rails / activerecord / lib / active_record / connection_adapters / abstract / query_cache.rb:34:in `cache '
vendor / rails / activerecord / lib / active_record / query_cache.rb:8:in `cache '
ベンダー/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in`perform_action'
vendor / rails / actionpack / lib / action_controller / base.rb:524:in `send '
vendor / rails / actionpack / lib / action_controller / base.rb:524:in `process_without_filters '
ベンダー/rails/actionpack/lib/action_controller/filters.rb:606:in`process_without_session_management_support'
vendor / rails / actionpack / lib / action_controller / session_management.rb:134:in `process '
vendor / rails / actionpack / lib / action_controller / base.rb:392:in `process '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:184:in `handle_request '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:112:in `dispatch_unlocked '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:125:in `dispatch '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:in `synchronize '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:in `dispatch '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:134:in `dispatch_cgi '
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:41:in `dispatch '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run '
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load_without_new_constant_marking'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:521:in`new_constants_in'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:142:in`load'
ベンダー/rails/railties/lib/commands/servers/mongrel.rb:64
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require '
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require '
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:153:in`require'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:521:in`new_constants_in'
ベンダー/rails/activesupport/lib/active_support/dependencies.rb:153:in`require'
ベンダー/rails/railties/lib/commands/server.rb:49
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require '
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require '
スクリプト/サーバー:3

リクエスト

パラメーター:

なし

セッションダンプを表示

---
:ユーザー:
:csrf_id:2927cca61bbbe97218362b5bcdb74c0f
flash:!map:ActionController :: Flash :: FlashHash {}


応答

ヘッダー:

{"Content-Type" => ""、
 "cookie" => []、
 "Cache-Control" => "no-cache"}

以前に動作させていたことを覚えておいてください。url_for(:back)は、このロジックを追加する前に正しく動作する方法を知っていました。

アイデアをよろしくお願いします!

4

2 に答える 2

4

コントローラでビューヘルパーメソッドを使用しようとしています。期待する動作はActionView::Helpers :: UrlHelperにありますが、呼び出しているメソッドはActionController::Baseにあります。残念ながら、両方のメソッドの名前は同じで、機能は非常に似ていますが、まったく同じではありません。

簡単に修正するために、ActionController :: Baseは、@templateすべてのActionViewヘルパーにアクセスできる変数を設定します。url_for次のように、そのオブジェクトから呼び出してみてください。

if params[:redirect]
  @url = params[:redirect]
else
  @url = @template.url_for :back
  @url ||= url_for :controller => "home", :action => "index"
end

しかし、それが「正しい」方法かどうかはわかりません。Railsの開発者が私たちに@template変数をすべて意地悪に使用することを望んでいた場合、彼らはそれをもっと宣伝するでしょう。

元のリファラー(探している:back)へのURLを取得する別の方法は、次のrequest方法を使用することです。

if params[:redirect]
  @url = params[:redirect]
else
  @url = request.env["HTTP_REFERER"]
  @url ||= url_for :controller => "home", :action => "index"
end
于 2010-05-26T02:30:27.570 に答える
2

私の場合、時々:backは私が残したい同じ場所を指しているので、ループが発生します。私の解決策は次のとおりです。application_controllerのメソッド

def new_loc
  url = request.referer.to_s
  url == "" || url == request.url ? root_path : url
end

とあなたのコントローラーで

@url = params[:redirect] ? params[:redirect] : new_loc

または私の場合

redirect_to new_loc

それでおしまい。Rails5を使用しています

于 2017-07-23T18:44:15.277 に答える