Переопределение контроллера регистрации разработки, чтобы разрешить переадресацию после успешной работы sign_up
Я посмотрел повсюду и нашел много информации... но ничего не работает для меня, и я не понимаю: (
Я знаю, что вы можете переопределить контроллер регистрации, например:
class Users::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
end
Затем, следуя примеру, показанному Тони Амаллом http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/, я должен изменить свои маршруты, чтобы обновить доступ к новому контроллеру:
devise_for :users, :controllers => { :registrations => "users/registrations" } do
#get '/author/sign_up', :to => 'devise/registrations#new'
#get '/client/sign_up', :to => 'devise/registrations#new'
get '/author/sign_up', :to => 'users/registrations#new'
get '/client/sign_up', :to => 'users/registrations#new'
end
Да, у меня здесь кое-что странное, потому что я нахожу какой-то определенный путь, чтобы отправить их на страницу регистрации, это позволяет мне эффективно создать 2 сценария регистрации.
Я прокомментировал, что у меня было до того, как переопределил регистрационный контроллер.
Даже если все это и мой author_waiting_path являются допустимым путем, он просто продолжает переходить на страницу входа после регистрации: (
Это действительно разочаровывает.
Алекс
edit: Я также нашел это на вики-разработке: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)
Но я понятия не имею, где определить этот метод создания? должен ли я переопределить контроллер сеанса???
edit 2:
Я помещаю фиктивное переопределение контроллера:
class Pouets::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
def new
super
end
def create
puts "was here"
super
end
def edit
super
end
def update
super
end
def destroy
super
end
def cancel
super
end
end
И я никогда не был "здесь" в моих журналах... У меня действительно есть ощущение, что он полностью игнорирует переопределение... Я должен делать что-то неправильно: (
Ответы
Ответ 1
Хорошо... Я могу переопределить его, чтобы вы были либо: 0
Создать папку приложения/контроллеры/пользователей
поставьте там registrations_controller.rb с: (опция с сеансом - но будет пытаться sign_in и позже перенаправить - для вас это может быть не предназначенное поведение). Кроме того, это из вики-разработки, и я не уверен, работает ли она
class Users::RegistrationsController < Devise::RegistrationsController
def create
session["#{resource_name}_return_to"] = complete_path
super
end
end
перезагрузить приложение (только для того, чтобы вы ничего не доверяли)
В общем, вы должны переопределить Create Если вы хотите перенаправить только пользователей... если вы хотите определить более сложный сценарий, вы должны monkeypatch sign_in_and_redirect
чтобы ваш контроллер выглядел как
class Users::RegistrationsController < Devise::RegistrationsController
# POST /resource/sign_up
def create
build_resource
if resource.save
set_flash_message :notice, :signed_up
#sign_in_and_redirect(resource_name, resource)\
#this commented line is responsible for sign in and redirection
#change to something you want..
else
clean_up_passwords(resource)
render_with_scope :new
end
end
end
второй вариант попробуйте помощник monkeypatch....
module Devise
module Controllers
# Those helpers are convenience methods added to ApplicationController.
module Helpers
def sign_in_and_redirect(resource_or_scope, resource=nil, skip=false)
#intended behaviour for signups
end
end
end
end
Ответ 2
Я пробовал вышеупомянутое решение, и, хотя он работает, читая код разработки, я обнаружил, что все, что вам действительно нужно для выписки только зарегистрированного пользователя и перенаправления:
- добавить is_approved или аналогично вашей пользовательской таблице и
- добавить active_for_authentication? метод в вашей модели пользователя.
код:
class User < ActiveRecord::Base
# ... some code
def active_for_authentication?
super && is_approved
end
end
Было немного сложно найти, когда мне это нужно, но это все. Я на самом деле пишу это здесь, если кому-то это понадобится.