Подтвердить что ты не робот

Переопределить конструкцию after_sign_up_path_for не работает

В маршрутах у меня есть указатель на корневой путь "home#index", но когда я пытаюсь переопределить это с помощью after_sign_up_path_for, перенаправление меня к корневому пути при входе или регистрации. Я попытался установить его как в разработке подкласса контроллера, так и в application_controller, но это не сработало. Что мне нужно сделать здесь?

Контроллер приложений

class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_up_path_for(resource)
    show_cities_path(resource)
  end
end

контроллер регистрации

class RegistrationsController < ApplicationController
  def after_sign_up_path_for(resource)
    show_cities_path(resource)
  end
end

маршруты

root :to => "home#index"
4b9b3361

Ответ 2

Если у вас также включен модуль Confirmable, вы должны переопределить after_inactive_sign_up_path_for, поскольку новая регистрация "неактивна" до тех пор, пока не будет подтверждена. after_sign_up_path_for, похоже, не вызван, когда Подтверждающий активен.

Ответ 3

Хотя я опаздываю на игру, я просто столкнулся с этой проблемой и не смог найти решение.

Если вы используете собственный RegistrationsController для настройки Devise, вам необходимо добавить метод after_sign_up_path_for (resource) к этому контроллеру вместо ApplicationController.

В registrations_controller.rb:

private

  def after_sign_up_path_for(resource)
    new_page_path
  end

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

Ответ 4

Я боролся с этой проблемой, пока не осознал, что забыл объявить, что я занимаюсь разработкой контролера регистрации. В моем случае я использую devuse с ресурсом user: поэтому я добавил это в route.rb:

devise_for :users, :controllers => {:registrations => "registrations"}

После этого перенаправление, указанное мной в after_inactive_sign_up_path_for, работало.

Переопределить контроллер регистрации версий имеет более полное обсуждение этой темы с альтернативными способами объявления переопределений.

Ответ 5

Спасибо за ваш намек: after_inactive_sign_up_path_for Это действительно ценно, но я обнаружил странную ситуацию, как показано ниже.

  • Внутри контроллера регистрации в рамках действия create, если вы сделаете что-то после оператора super, это будет пропущено

Я также написал об этом здесь: http://datefield.blogspot.com/2012/05/rails-devise-allow-user-from-facebook.html

Ответ 6

Я только что взорвал около 2 часов, но LiveReload был моей проблемой. Я был перенаправлен успешно, но LiveReload собирал изменения на development.sqllite и отменял запрос.

Ответ 7

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

devise-3.4.1 $ vim app/controllers/devise/registrations_controller.rb

  # POST /resource
  def create
    build_resource(sign_up_params)

    resource_saved = resource.save
    yield resource if block_given?
    if resource_saved
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      @validatable = devise_mapping.validatable?
      if @validatable
        @minimum_password_length = resource_class.password_length.min
      end
      respond_with resource
    end
  end

Как показано в коде:

      if resource.active_for_authentication?
        ...
        respond_with resource, location: after_sign_up_path_for(resource)

      else
        ...
        respond_with resource, location: after_inactive_sign_up_path_for(resource)