Передача параметров во время входа в Devise - PullRequest
3 голосов
/ 06 мая 2011

Позвольте мне сначала сформулировать вопрос: Как пройти через параметры во время входа в 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

... и я указал вways.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 Ответ

0 голосов
/ 26 марта 2012

Я думаю, что вы можете создать действие профиля в 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.

...