1

Rails 3 を使用しています。私のアプリ全体は、Devise 2.2 を使用する登録ユーザーに制限されています。

私の要件:「ユーザーがサブスクライブしたときにアイテムXを表示したかった(item /:idが要求されたURLであった)」と言えること。可能な限り、ユーザーが登録時に見たかったアプリの項目を伝えます。

例 : ジョンは www.website/item/48 リンクをクリックしましたが、システムに登録されていません。devise が彼を devise ログイン ページにリダイレクトした後、彼は登録し、www.website/item/48 にリダイレクトされました (標準的なデバイスの動作)。その後、サイトの管理者は、ユーザー john@whatever.net がアイテム 48 を表示するためにアカウントを作成したことを確認できます。

現在、devise は最も古典的な方法でセットアップされておりbefore_filter :authenticate_user!、すべてのコントローラーに a が含まれています。ログイン/購読ページは、デザインを除いてデフォルトのものと似ています。

device のデフォルトの登録コントローラーをオーバーライドしました:

class RegistrationsController < Devise::RegistrationsController

  def new
    super
    logger.debug"--------------------------------"
    logger.debug session.inspect
    logger.debug params.inspect 
    logger.debug resource
    logger.debug"--------------------------------"
  end

  def create
    super
    logger.debug"-----------------------------------"
    logger.debug session.inspect
    logger.debug params.inspect 
    logger.debug resource.inspect
    logger.debug"-----------------------------"
  end
end

要求された URL を Devise から取得する方法がわかりません。新しいアクション中にセッション変数でそれを見ることができますが、作成すると見つけることができません。

Deviseの作成アクションで要求されたURLを取得して保存するにはどうすればよいですか?

4

2 に答える 2

2

そうです、メソッドをオーバーライドsign_upして、次のコードでその URL を取得できます。

def sign_up(resource_name, resource)
  scope = Devise::Mapping.find_scope!(resource_or_scope)
  url = session["#{scope}_return_to"] # here is your url

  super
end
于 2013-05-15T17:43:45.260 に答える
1

sign_up次のように、登録コントローラーでメソッドをオーバーライドする必要があります。

def sign_up(resource_name, resource)
  scope = Devise::Mapping.find_scope!(resource))
  path = session["#{scope}_return_to"] || signed_in_root_path(scope)
  logger.debug("Requested path before sign up: #{path}")
  sign_in(resource_name, resource)
end

他の方法で保存したい場合は、もちろん logger.debug を変更できます。重要な部分はsession["#{scope}_return_to"] || signed_in_root_path(scope).

これは同じものを返しafter_sign_up_path_for(resource)ますが、セッション内のリファラー パスを削除しません。

于 2013-05-15T14:57:14.757 に答える