Переопределение контроллера регистрации разработки, чтобы разрешить переадресацию после успешной работы 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

Было немного сложно найти, когда мне это нужно, но это все. Я на самом деле пишу это здесь, если кому-то это понадобится.