web-dev-qa-db-ja.com

after_sign_in_path_forを考案...送信先.... root_path-クエリ

ログインに成功した後にカスタムページにリダイレクトして、テスト担当者の名前と年齢(テストデータ)を入力して新しいレコードを作成するための、デバイス認証gemのルートの問題についてサポートが必要です。

私はRails 3をデバイスバージョン1.4.9で使用しています

私のルートは以下の通りです

    new_user_session GET    /users/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
        user_session POST   /users/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
destroy_user_session DELETE /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
       user_password POST   /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
   new_user_password GET    /users/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
  edit_user_password GET    /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                     PUT    /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
   cancel_user_registration GET    /users/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
   user_registration POST   /users(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
   edit_user_registration GET    /users/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                     PUT    /users(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                     DELETE /users(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
             testers GET    /testers(.:format)             {:action=>"index", :controller=>"testers"}
                     POST   /testers(.:format)             {:action=>"create", :controller=>"testers"}
          new_tester GET    /testers/new(.:format)         {:action=>"new", :controller=>"testers"}
         edit_tester GET    /testers/:id/edit(.:format)    {:action=>"edit", :controller=>"testers"}
              tester GET    /testers/:id(.:format)         {:action=>"show", :controller=>"testers"}
                     PUT    /testers/:id(.:format)         {:action=>"update", :controller=>"testers"}
                     DELETE /testers/:id(.:format)         {:action=>"destroy", :controller=>"testers"}
                root        /                              {:controller=>"testers", :action=>"index"}

アプリケーションコントローラーで、以下のようなメソッドをオーバーライドしようとしましたが、役に立たなかったため、テスターインデックスにルーティングされました。

class ApplicationController < ActionController::Base

  protect_from_forgery

  def after_sign_in_path_for(resource) 

      new_tester_path

  end

end

私のroutes.rbファイルには以下の行があります

Testing::Application.routes.draw do

  devise_for :users 

  resources :testers

  root :to => 'testers#index'

コードの多くはスキャフォールディングで実行されましたが、new_tester_pathまたはルート/ testers/newにリダイレクトする方法を理解できませんでしたsuccessful sign_inユーザーの電子メールとパスワードによる。

誰かが私が欠けているものを教えてもらえますか.....オーバーライド関数を書いている間、私が指定する必要がある正確なルートを知りたいです。

テスト中に私はこのような愚かなことを試みましたが、グーグルページも開いていません... :(

class ApplicationController < ActionController::Base 

protect_from_forgery 

helper ApplicationHelper

def after_sign_in_path_for(resource) 

"www.google.com" 

end 

def after_sign_up_path_for(resource) 

"www.google.com" 

end 

def after_update_path_for(resource) 

"www.google.com" 

end 
14
Salman Ahmed

このスニペットを使用してください:

class ApplicationController < ActionController::Base
    def after_sign_in_path_for(user)
        user_url(user)
    end
end
22
donnie rawlings

セッションでuser_return_toパスを設定してみてください。

session['user_return_to'] = new_tester_path

Devise :: SessionsControllerから派生したコントローラーでそれを行うことができます

5
cthulhu

RailsエンジンのApplicationController内のafter_sign_in_path_forまたはafter_sign_out_path_forヘルパーメソッドをオーバーライドしようとして問題が発生した場合は、これを確認することをお勧めします 回答

ApplicationControllerの代わりにエンジンのSessionsControllerをオーバーライドする必要がある方法について説明します。

1
yellowaj

これは相続の問題だと思います。 after_sign_in_path_forは、もともとDevise :: SessionsController内で定義されています。 SessionsControllerをDevise :: SessionsControllerから継承させ、そのコントローラー内で再定義することで、オーバーライドできます。

1
zykadelic

Deviseのドキュメントでは、 サインインが成功すると特定のページにリダイレクトする までのすべての手順が説明されています。テクニックを組み合わせることで、サインインに成功した後、ユーザーを多くの場所にリダイレクトできます。

履歴書は次のとおりです。

これは、Devise :: SessionsControllerから継承したコントローラーで実行できます。まず、controllers/users /sessions_controller.rbで実行できます。

module Users
  class SessionsController < Devise::SessionsController
   def new
     if params[:redirect_to].present?
       self.resource = resource_class.new(sign_in_params)
       store_location_for(resource, params[:redirect_to])  
     end
     super
   end
  end
end

Config/routers.rbには、次のものも追加されています。

devise_for :users, controllers: {sessions: 'users/sessions'}

また、ApplicationControllerにカスタムafter_sign_in_path_forを追加する必要があります

class ApplicationController < ActionController::Base
  protected
  def after_sign_in_path_for(resource)
    stored_location_for(resource) || root_path
  end
end

私が知っているように、これはすべてのDeviseバージョンで機能します。

0
Fernando Kosh

あなたは何も悪いことをしていないようです。多分これはDeviseの問題です。

Railsアプリでこれを分離し、Deviseで問題を開いてみてください。

0
Rodrigo Flores