2011-01-20 3 views
9

Попытка перенаправить пользователей на связанную с ними «домашнюю страницу» после успешного входа в систему без выхода ..., которая дает мне несколько бесконечных циклов перенаправления (довольно уверен, что я настройте его неправильно).Devise gem in Rails: сгенерируйте user_root_path

Несмотря на это, я ищу лучший подход ...

Devise's docs состояние: После подписания в пользователе, подтверждающий счета или обновление пароля, Разрабатывают будут искать контекстный корень путь для перенаправления. Пример: для :user ресурс он будет использовать user_root_path, если он существует, иначе по умолчанию root_path будет б/у. Это означает, что вам необходимо установить в корне внутри ваших маршрутов: root :to => "home"

Я Сорт новичка ... как можно идти о создании этого home_root_path для каждого пользователя?

rDocs also mention:.

- (Object) after_sign_in_path_for (resource_or_scope)

по умолчанию URL-использовать после подписания в этом используется всеми Разрабатывают контроллеров и вы можете перезаписать это в вашем ApplicationController до обеспечивает пользовательский крючок для настраиваемого ресурса . По умолчанию он сначала пытается найти resource_root_path, иначе использует корневой путь. Для охвата пользователей , вы можете определить URL по умолчанию следующим образом:

map.user_root '/users', :controller => 'users' # creates user_root_path 

map.namespace :user do |user| 
    user.root :controller => 'users' # creates user_root_path 
end 

, но это только дает мне undefined local variable or method карту»для #ActionDispatch :: Routing :: Mapper: ...` ошибки.

+1

Какую версию рельсов вы используете? Предыдущие биты after_sign_in_path_for используют синтаксис маршрутизации rails 2.x. Если вы используете рельсы 3.x, тогда они могут вызвать проблемы. – encoded

ответ

6

Вы могли бы попробовать что-то вроде этого:

application_controller.rb:

def after_sign_in_path_for(resource_or_scope) 
    # return home_page_path for user using current_user method 
end 
+0

Рик получил ответ от этого. См. Мой комментарий под ответом Рика для возможного получения. –

6

порылся немного, чтобы выяснить то же самое. @ Ответ polarblau является правильным,

def after_sign_in_path_for(resource_or_scope) 
    user_info_path(current_user) 
end 

где user_info_path путь к странице, которую вы хотите отобразить.

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

def after_sign_in_path_for(resource) 
    if resource.is_a(User) 
    user_info_path(resource) 
    else 
    super 
    end 
end 
+0

Это работает для меня, хотя я изменил его на resource.is_a? (User) –

+0

Этот подход всегда идет по тому же пути в signin, но я обнаружил, что он также переопределяет встроенную способность Devise для возврата к пути после таймаута сеанса , То есть При разработке автоматически сохраняется 'session [: user_return_to]' на выводе, но если вы установите 'after_sign_in_path_for', как показано здесь, эта переменная сессии игнорируется. Используя подход 'user_root' route, как и в ответе SnapShot, вы можете сделать так: перейдите в' user_return_to', если он определен в сеансе, иначе перейдите к пути, определенному как 'root_path'. –

22

Если вы хотите перенаправить с помощью маршрута в ответ на ваш вопрос ниже:

, как можно идти о создании этого home_root_path для каждого пользователя?

Это будет работать, если вы поместите его в свой файл конфигурации/маршрутов. Он перенаправляет пользователя на индекс статьи # после (например) успешного подтверждения.

match 'user_root' => 'articles#index', as: :user_root 
+1

В Ruby 1.8 синтаксис немного отличается: ': as =>: user_root' – slothbear

+1

Я пробовал его без': as', и, похоже, он работает одинаково. Есть ли какое-то преимущество для включения ': as'? – slothbear

1

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

def after_sign_in_path_for(resource) 
    current_user 
end 

Если я когда-нибудь пробовали current_user_path, я всегда получал undefined local variable or method current_user_path ошибки.

Кроме того, я использую Rails 3.2.8 и Devise 2.1.2.

Надеюсь, что это поможет.

1

Основываясь на ответе @SnapShot, это сработало для меня. Я использую несколько моделей разработки, пытаясь перенаправить обратно на страницу редактирования профиля пользователя.

get 'user_root', to: redirect('/users/edit'), as: :user_root 
Смежные вопросы