3

Deviseサインインプロセス中にパラメータを渡すにはどうすればよいですか?

ユーザーのコレクションがあり、それぞれに独自のプロファイル ページがあります。アプリケーションのすべてにアクセスできる管理者でない限り、自分のプロファイル ページは表示できるが、他のユーザーのプロファイル ページは表示できないようにしたい。

Users コントローラーを作成し、次のコードをコントローラーの先頭に適用しました。ID による検索をユーザー名に置き換えたので/users/username、プロファイルにアクセスするには:

filter_access_to :all do
  current_user == User.find_by_username(params[:id]) or
    has_role? :admin
end

そして、routes.rb で次のように指定しました。

root :to => "users#show"

ユーザーがアクセス http://appli.cat.ionすると、ログイン資格情報の入力を求められroot_path、ユーザー コントローラーの表示アクションである にリダイレクトされます。idサインイン プロセス中にパラメーターを渡すことができない限り、エンドレス リダイレクト ループが発生します。この問題を解決するために Devise に何かありますか?

次の 2 つの 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た場合にのみ、目的の効果が得られます。stored_location_for

def stored_location_for(resource)
  nil
end

(http)://appli.cat.ion/繰り返しますが、私の目標は、ユーザーがサインインしている場合に直接移動した場合、ユーザーをプロファイル ページにリダイレクトすることです。ユーザーがナビゲートした場合、ユーザー(http)://appli.cat.tion/otherresourcesをサインインさせ、要求したページにリダイレクトします。私が戻るnilstored_location_for、ユーザーは何があっても常に自分のプロフィール ページにリダイレクトされます。これは良くても望ましくなく、最悪の場合は使用できません。アプリケーションのサインインに直接移動すると、stored_locationが返さnilれ、サインインするとプロファイル ページにリダイレクトされると思いますが、root_path.

4

1 に答える 1

0

ユーザー表示ページへのリダイレクトを行う 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フックを使用する必要はありません。

于 2012-03-26T06:04:49.943 に答える