1

アプリをデモするために偽のユーザーを設定しました。サインインしない訪問者は、実際のユーザーが持つであろうすべての機能を引き続き見ることができるはずです。ログインしていない訪問者がサイトにアクセスすると、アプリはデモユーザーにサインインし、訪問者にはこのデモユーザーに属する偽のデータが表示されます。

この目標を念頭に置いて、アプリケーションコントローラーをこのようにセットアップします。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_current_user

  def demo_user
    @demo_user ||= User.find_by_email("demo@example.com")
  end

  protected
    def set_current_user
      if current_user.nil?
        sign_in(demo_user)
      end
    end
end

私の問題は、実際のユーザーが誤ってサインインできないようにしてしまったことです。実際のユーザーが「サインイン」リンクを押すと、(デモユーザーとして)すでにサインインしていると通知されます。

明らかに、私が行ったことは「ベストプラクティス」にほど遠いものです。この状況で賢いプログラマーは何をしますか?気の利いた自動サインインデモユーザーを維持しながら、実際のユーザーがサインインできるようにドアを開いたままにするにはどうすればよいですか?

4

3 に答える 3

3

それが何であれ、sign_in アクションで実行されないように、:exceptを追加する必要があります。:before_filterdevise を使用していると仮定すると、それは になるSessionsController#newため、次のようになります。

before_filter :set_current_user, :except => :new

これにより、すべての「新しい」アクションのフィルターがスキップされることに注意してください。したがって、よりターゲットを絞った方法は (Devise を使用していると仮定して) からSessionsController継承するカスタムを作成し、次のDevise::SessionsController場合を除いて空白のままにすることです。

skip_before_filter :set_current_user, :only => [:new, create]
于 2013-03-15T15:07:54.997 に答える
1

関数set_current_userは、before_filterリクエストごとに 1 回実行されることを意味します。初めてアクセスcurrent_userするnilので、デモ ユーザーとしてサインインします。アクション (またはアプリで呼び出されているもの)をスキップできbefore_filterますsessions_controller#create。たとえば、Devise を使用している場合:

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, :only => :create
end
于 2013-03-15T15:12:57.777 に答える
0

これが私が最終的に得たものです。私は Omnikron のソリューションから始めましたが、もう少し必要でした。

この投稿は役に立ちました: https://groups.google.com/forum/#!msg/plataformatec-devise/0WylcwjSAJY/ITDF6kFjJvwJ .

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, only: [:new, :create]
  skip_before_filter :require_no_authentication, :only => [:new, :create]

  def new
    if user_signed_in?
      sign_out current_user
      redirect_to new_user_session_path
    else
      super
    end
  end
 end
于 2013-03-16T13:08:39.230 に答える