Передача параметров во время входа в Devise
Позвольте мне сначала сформулировать вопрос: как пройти через параметры во время входа в систему Devise?
Теперь остальное...
Я пытаюсь реализовать следующие функции в моем приложении Rails 3.
У меня есть коллекция пользователей, каждый со своей страницей профиля. Я хочу, чтобы они могли просматривать свою собственную страницу профиля, но не одну из страниц профиля других пользователей, если только они не администраторы, и в этом случае у них есть доступ ко всему в приложении.
Я создал контроллер Users и применил следующий код к началу контроллера (для записи, которую я заменил, ища по id их имя пользователя, поэтому /users/username для доступа к профилю):
filter_access_to :all do
current_user == User.find_by_username(params[:id]) or
has_role? :admin
end
... и я указал в route.rb:
root :to => "users#show"
Поэтому, если пользователь получит доступ к следующему URL-адресу: http://appli.cat.ion/ ему сначала будет предложено ввести учетные данные для входа в систему, а затем он будет перенаправлен на root_path, который является действием show контроллера Users. Если я не смогу передать параметр: id во время входа в систему, это приведет к бесконечному циклу перенаправления. Есть ли что-то в Devise, что помогает с этой проблемой? Я буду самостоятельно искать и выкладывать ответ, если найду ответ.
Спасибо,
Les
РЕДАКТИРОВАТЬ # 1: Я считаю, что я подошел ближе к решению. Основываясь на желаемой функциональности, которая мне нужна, я считаю, что следующие два метода Devise могут помочь:
after_sign_in_path_for(resource)
а также
stored_location_for(resource)
Я переопределил after_sign_in_path к следующему:
def after_sign_in_path_for(resource)
user_root_path(:id => current_user.username)
end
который обеспечивает желаемый эффект (пользователь входит в систему, перенаправляется на страницу своего профиля), но только если я верну nil в сохраненном_ расположении_для так:
def stored_location_for(resource)
nil
end
Просто чтобы подтвердить мою цель, моя цель - перенаправить пользователя на страницу его профиля, если он перешел по адресу (http)://appli.cat.ion/ напрямую, после чего он, конечно, вошел в систему. Если пользователь переходит, скажем, к (http)://appli.cat.tion/otherresources, я хочу сначала войти в систему, а затем перенаправить его на запрошенную страницу. Если я верну nil в store_location_for, то пользователь ВСЕГДА будет перенаправлен на страницу своего профиля, несмотря ни на что, что в лучшем случае нежелательно, а в худшем непригодно. Я бы подумал, что если я перейду к входу в приложение напрямую, то Storage_location вернет nil, а после входа будет перенаправлен на страницу моего профиля, но он просто перенаправит меня на путь root_path. Очень смущен, но по крайней мере я делаю успехи...
1 ответ
Я думаю, что вы можете создать действие профиля в UsersController, который делает перенаправление на страницу показа пользователя, а затем пометить его как пользователя root
в UsersController
class UsersController < ApplicationController
...
def profile
redirect_to user_url(:id => current_user.username)
end
...
end
в маршрутах
resources :users do
get 'profile', :on => :collection, :as => :user_root
end
И не нужно использовать хук after_sign_in_path.