Ответ 1
Просто используйте этот фрагмент:
class ApplicationController < ActionController::Base
def after_sign_in_path_for(user)
user_url(user)
end
end
Мне нужна помощь с проблемой маршрутизации с помощью устройства для проверки подлинности, чтобы перенаправить на пользовательскую страницу после успешного входа в систему, чтобы создать новую запись, введя имя и возраст испытуемого (тестовые данные).
Я использую 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 или маршрут /тестер/новый после успешно sign_in по электронной почте и паролю пользователя.
Может кто-то, пожалуйста, дайте мне знать, чего я не хватает..... при написании функции переопределения, я хотел бы знать точный маршрут, который мне нужно указать.
Во время тестирования я пробовал что-то глупое, как это, но страница 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
Просто используйте этот фрагмент:
class ApplicationController < ActionController::Base
def after_sign_in_path_for(user)
user_url(user)
end
end
Попробуйте установить user_return_to путь в сеансе:
session['user_return_to'] = new_tester_path
Вы можете сделать это в контроллере, полученном из Devise:: SessionsController
Я считаю, что это проблема наследования. after_sign_in_path_for изначально определяется в Devise:: SessionsController. Вы можете переопределить его, сделав свой SessionController наследованием от Devise:: SessionsController, а затем переопределив его внутри этого контроллера.
Если у вас возникли проблемы с попыткой переопределить вспомогательные методы after_sign_in_path_for
или after_sign_out_path_for
в программе ApplicationController of Rails, вы можете проверить этот ответ.
В нем описывается, как вам нужно переопределить SessionController в вашем движке, а не ApplicationController.
Кажется, вы ничего не делаете неправильно. Возможно, это проблема разработки.
Вы можете попытаться изолировать это в приложении Rails и открыть проблему в Devise?
Документация Devise объясняет все шаги перенаправление на определенную страницу при успешном входе. Комбинируя методы, вы можете перенаправить пользователя во многие места после успешного входа.
Вот резюме:
Вы можете сделать это в контроллере, который вы наследуете от Devise:: SessionsController - во-первых, в контроллерах /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/routes.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, как я знаю.