Ответ 1
Вот как я получил эту работу.
# In your routes.rb
match 'dashboard' => 'user_dashboard#index', :as => 'user_root'
Затем убедитесь, что на вашем контроллере home#index
нет before_filter :authenticate_user!
.
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.*
Серьезно, я не могу найти способ сделать это. Любые идеи, пожалуйста?:)
EDIT: MY ROUTES
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
......
Вот как я получил эту работу.
# In your routes.rb
match 'dashboard' => 'user_dashboard#index', :as => 'user_root'
Затем убедитесь, что на вашем контроллере home#index
нет before_filter :authenticate_user!
.
Im, используя Devise 1.3.4 с Ruby On Rails 3.0.7. После проверки Интернета для решения, я сделал просто вставить следующий код
* first) * Чтобы перенаправить после успешной регистрации на страницу приветствия, поместите в /config/routes.rb следующее (обратите внимание, замените :user
на аргумент, предоставленный devise_for
):
namespace :user do
root :to => "welcome#index"
end
* second) * Чтобы перенаправить после выхода (на страницу приветствия), поместите в /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
Это сработало для меня, я надеюсь, что это все для вас.
Ответ на этот вопрос, который отлично сработал у меня, объясняется в Вики-дизайне здесь:
Как: Перенаправить на определенную страницу при успешной регистрации (регистрации)
Поскольку никто не отвечает, я буду звонить. Вы уверены, что это код, вызывающий ошибку? Ваш resource_or_scope
, являющийся нолем, кажется, что Devise - это проблема, но я сомневаюсь в этом. Поэтому я думаю, что проблема в другом месте.
Я бы попробовал следующее, чтобы убедиться, что он работает в первую очередь.
def after_sign_in_path_for(resource)
"http://www.google.com"
end
Если это работает, попробуйте проверить переменную resource
, чтобы убедиться, что она не равна нулю.
Вы пробовали переписывать метод 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
Не уверен, что это полезно или нет, но я столкнулся с теми же проблемами, но разница в том, что я использую настраиваемый контроллер регистрации.
Из исходного кода для RegistrationsController, похоже, он вызывает sign_in_and_redirect, который по очереди передает его методу redirect_location.
Я переопределяю redirect_location, чтобы просто вернуть путь из after_sign_up_path_for (resource), а не stored_location_for (scope) || after_sign_up_path_for (ресурс).
Внутри after_sign_up_path_for (resource) я настраиваю метод перенаправления на правильный путь на основе типа пользователя
Работает в Rails 3.0.5 и Devise 1.3.0 для меня.
Проблема заключается в том, что 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)
, чтобы правильно перенаправить последующие входы на ресурс.
Что сказал Тони. Пространство имен не предназначено для использования таким образом. Я не знаю, кто придумал этот хак, который не работает вообще, но, к сожалению, это одно из самых первых решений, которые возникают при поиске в Интернете.
namespace :user do
root :to => "town#index"
end
устанавливает '/user' как user_root_path и указывает на действие индекса контроллера пользователя/города, которого у вас нет. У вас есть "городской" контроллер. И вот почему вы получили ошибку. Вам нужно
get '/town', to: 'town#index', as: 'user_root'
Таким образом, '/town' указывает на "индекс города #" и настраивается как ваш user_root_path, который является тем, что Devise перенаправляет после пользователя
поэтому вам даже не нужно переопределять after_sign_in_path_for
, что, вопреки тому, что многие считают, не является лучшим местом для решения проблемы перенаправления при разработке.
в Rails 4.1+ и Devise 3.2
У меня была аналогичная проблема. В конце концов прибегают к утверждению if в контроллере приложения. Если пользователь выполнил вход, и у них нет профиля, то перейдите на путь new_profile_path