Разработать редирект после регистрации - PullRequest
18 голосов
/ 14 февраля 2011

Devise доставляет мне довольно тяжелые времена.Пока что все остальное работает, кроме перенаправления регистрации.Я хочу, чтобы devise перенаправлял на мой контроллер города при действии индекса, при регистрации или входе в систему (логин действительно работает).

Я попытался переопределить RegistrationsController и попытался добавить функцию applicationController, например:

  def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(User)
      town_path
    else
      super
    end
  end

Тем не менее, я получаю ту же ошибку:

NoMethodError in User/townController#index

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.*

Серьезно, я не могу найти способ сделать это.Есть идеи, пожалуйста?:)

РЕДАКТИРОВАТЬ: МОИ МАРШРУТЫ

      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 GET    /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"}
     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"}
                  root        /(.:format)                                    {:action=>"index", :controller=>"home"}
             user_root        /user(.:format)                                {:action=>"index", :controller=>"user/town"}
                  home        /home(.:format)                                {:action=>"index", :controller=>"home"}
                  town        /town(.:format)                                {:action=>"index", :controller=>"town"}
                 inbox        /messages(.:format)                            {:action=>"index", :controller=>"messages"}
                 inbox        /messages/inbox(.:format)                      {:action=>"inbox", :controller=>"messages"}

Routes.rb:

  devise_for :users

  root :to => "home#index"

  namespace :user do
    root :to => "town#index"
  end  

  scope :path => '/home', :controller => :home do
    match '/' => :index, :as => 'home'
  end

  scope :path => '/town', :controller => :town do
    match '/' => :index, :as => 'town'
  end
......

Ответы [ 9 ]

14 голосов
/ 31 мая 2011

Я использую Devise 1.3.4 с Ruby On Rails 3.0.7.После проверки Интернета на предмет решения я просто вставил следующий код

* сначала) * Для перенаправления после успешной регистрации на странице приветствия, поместите в / config/routes.rb следующее (обратите внимание, замените :user аргументом, который вы указали для devise_for):

namespace :user do
root :to => "welcome#index"
end

* секунда) * Перенаправить после выхода из системы (на страницу приветствия), поместите в /app/controllers/application_controller.rb этот метод:

private
# Overwriting the sign_out redirect path method
def after_sign_out_path_for(resource_or_scope)
welcome_index_path
end

Это сработало для меня, я надеюсь, что оно подойдет для всех вас.

11 голосов
/ 17 февраля 2011

Вот так у меня получилось.

# In your routes.rb
match 'dashboard' => 'user_dashboard#index', :as => 'user_root'

Затем убедитесь, что на контроллере home#index не установлено before_filter :authenticate_user!.

9 голосов
/ 19 июня 2011

Ответ на этот вопрос, который отлично сработал для меня, объяснен в вики Devise здесь:
Как: Перенаправить на определенную страницу при успешной регистрации (регистрации)

6 голосов
/ 14 февраля 2011

Поскольку никто не отвечает, я подключусь. Вы уверены, что именно этот код вызывает ошибку?Ваше resource_or_scope, равное нулю, создает впечатление, что проблема в Devise, но я сомневаюсь, что это так.Так что я думаю, что проблема в другом.

Я бы попробовал следующее, просто чтобы убедиться, что он работает первым.

  def after_sign_in_path_for(resource)
    "http://www.google.com"
  end

Если это сработает, попробуйте проверить переменную resourceчтобы убедиться, что это не ноль.

2 голосов
/ 12 июля 2014

Что сказал Тони. Пространство имен не предназначено для использования таким образом. Я не знаю, кто придумал этот взлом, который вообще не работает, но, к сожалению, это одно из самых первых решений, которые появляются при поиске в Google.

namespace :user do
  root :to => "town#index"
end

устанавливает '/ user' как user_root_path и указывает на действие index контроллера 'user / town', которого у вас нет. У вас есть «городской» контролер. И именно поэтому вы получили ошибку. Что вам нужно, это

get '/town', to: 'town#index', as: 'user_root'

Таким образом, «/ town» указывает на «town # index» и устанавливается как ваш user_root_path, на который Devise перенаправляет после пользователя

  1. Войти
  2. регистрация
  3. обновить пароль

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

на Rails 4.1+ и Devise 3.2

2 голосов
/ 14 февраля 2011

Вы пробовали переписать метод devise sign_in_and_redirect; Это будет работать для вас

def sign_in_and_redirect(resource_or_scope,resource)
    if resource_or_scope == :user
      redirect_to town_path
    else
      super
    end
end
1 голос
/ 03 января 2012

Проблема в том, что Devise обходит after_sign_in_path_for(resource) при входе в только что созданный ресурс.Вам нужно after_sign_up_path_for(resource):

# override in your ApplicationController or custom Devise::RegistrationsController  
def after_sign_up_path_for(resource)
  if resource.is_a?(User)
    town_path
  else
    super
  end
end

Вам все равно потребуется переопределение after_sign_in_path_for(resource), чтобы правильно перенаправить последующие входы в ресурс.

1 голос
/ 18 апреля 2011

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

Из исходного кода устройства для RegistrationsController кажется, что он вызывает sign_in_and_redirect, который, в свою очередь, передает его методу redirect_location.

Я переопределяю redirect_location, чтобы просто возвращать путь из after_sign_up_path_for (ресурс), а не хранимой_файлы_for (область) || after_sign_up_path_for (ресурс).

Внутри after_sign_up_path_for (ресурс) я настраиваю метод для перенаправления на правильный путь в зависимости от типа пользователя

Работает в Rails 3.0.5 и Devise 1.3.0 для меня.

0 голосов
/ 20 февраля 2011

У меня была похожая проблема.В конце концов прибегает к оператору if в контроллере приложения.Если пользователь выполнил вход в систему и у него нет профиля, перейдите к new_profile_path

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...