Разработать after_sign_in_path_for ... отправка в .... root_path - запрос - PullRequest
14 голосов
/ 23 ноября 2011

Мне нужна помощь с проблемой маршрутов с гемом devise authentication для перенаправления на пользовательскую страницу после успешного входа в систему, чтобы создать новую запись путем ввода имени и возраста тестируемого лица (тестовые данные)

Я использую 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

В моем файле rout.rb у меня есть следующие строки

Testing::Application.routes.draw do

  devise_for :users 

  resources :testers

  root :to => 'testers#index'

Хотя большая часть кода была сделана с помощью строительных лесов, я все еще не мог понять, как перенаправить на new_tester_path или маршрут / testers / new после успешного входа_ин по электронной почте и паролю пользователя.

Может кто-нибудь, пожалуйста, дайте мне знать, что мне не хватает ..... при написании функции переопределения я хотел бы знать точный маршрут, который мне нужно указать.

Во время тестирования я попробовал что-то глупое, как это, но страница Google также не открывается ... :(

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 

Ответы [ 6 ]

22 голосов
/ 12 октября 2012

Просто используйте этот фрагмент:

class ApplicationController < ActionController::Base
    def after_sign_in_path_for(user)
        user_url(user)
    end
end
5 голосов
/ 23 ноября 2011

Попробуйте установить путь user_return_to в сеансе:

session['user_return_to'] = new_tester_path

Вы можете сделать это в контроллере, производном от Devise :: SessionsController

1 голос
/ 09 января 2014

Если у вас возникают проблемы при попытке переопределить вспомогательные методы after_sign_in_path_for или after_sign_out_path_for в ApplicationController движка Rails, вы можете проверить этот ответ .

В нем описывается, как вам нужно переопределить SessionsController в вашем движке вместо ApplicationController.

1 голос
/ 21 августа 2012

Я считаю, что это проблема наследования. after_sign_in_path_for изначально определен в Devise :: SessionsController. Вы можете переопределить его, сделав свой SessionsController наследующим от Devise :: SessionsController, а затем заново определив его в этом контроллере.

0 голосов
/ 01 февраля 2018

Документация Devise объясняет все шаги для перенаправления на определенную страницу при успешном входе в систему . Комбинируя приемы, вы можете перенаправить пользователя во многие места после успешного входа.

Вот резюме:

Вы можете сделать это в контроллере, который вы унаследовали от Devise :: SessionsController - во-первых, в controllers / users / session_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 / rout.Rb вы бы также добавили:

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

И вы должны добавить собственный after_sign_in_path_for в свой ApplicationController

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

Это работает во всех версиях Devise, насколько я знаю.

0 голосов
/ 23 ноября 2011

Вы, кажется, не делаете ничего плохого. Может быть, это проблема Devise.

Не могли бы вы попытаться изолировать это в приложении Rails и открыть проблему в Devise?

...