Переопределение контроллера регистрации Devise, чтобы разрешить перенаправление после успешной регистрации - PullRequest
10 голосов
/ 24 января 2011

Я посмотрел повсюду и нашел много информации ... но у меня ничего не работает, и я не понимаю: (

Я знаю, что вы должны отменить регистрациюконтроллер, как это:

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 является допустимым путем, он просто продолжает переходить на страницу входа после регистрации: (

Это действительно расстраивает.

Alex

edit: я также нашел это в вики устройства: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)

Но я понятия не имею, где определить этот метод создания? Должен ли я переопределить sessi?на контроллере ???

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

И я никогда не "был здесь" в моих журналах.... У меня действительно такое чувство, что оно полностью игнорирует переопределение ... Я, должно быть, делаю что-то не так: (

Ответы [ 2 ]

9 голосов
/ 24 января 2011

Хорошо ... Я могу переопределить его, поэтому вы должны быть либо: 0

Создать папку app / controllers / users

поместить туда registrations_controller.rb с: (опция с сеансом- но он попробует sign_in и позже перенаправит - это может быть нежелательное поведение для вас).Более того, это из вики-устройства devise, и я не уверен, работает ли оно

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
3 голосов
/ 29 июля 2011

Я попробовал вышеуказанное решение, и пока оно работает, читая код устройства, я обнаружил, что все, что вам действительно нужно для того, чтобы выйти из системы только что зарегистрированным пользователем и перенаправить его:

  1. добавить is_approved или аналогично вашей пользовательской таблице и
  2. добавить active_for_authentication? метод в вашей пользовательской модели

Код:

class User < ActiveRecord::Base

  # ... some code

  def active_for_authentication?
    super && is_approved
  end
end

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

...