2015-11-16 27 views
7

私はRails 4(4.2.3)アプリケーションで作業を始めました。ここでは、ユーザ認証にDeviseを使用しています。私は、テストプロジェクトを作成してuppに署名する前に、ユーザーがアプリを使って遊んで、ゲストユーザとしてサインインできるようにしたい。ユーザーがサインアップ(または)すると、テストプロジェクトを新しい現在のユーザーに割り当てる必要があります。Rails 4 - Deviseさん、ゲストユーザがフィルタチェーンを停止させました

私はPlatformatecから、このガイドを、次のされています:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

は、ゲストユーザの作品を作成しますが、アクティブなゲストユーザセッションにサインアップするか、でたとき、私は次のエラーを取得する:

Filter chain halted as :require_no_authentication rendered or redirected 

の場合私は自分のセッションをクリアする。

def current_or_guest_user 
    if current_user 
    if session[:guest_user_id] && session[:guest_user_id] != current_user.id 
     logging_in 
     guest_user(with_retry = false).try(:destroy) 
     session[:guest_user_id] = nil 
    end 
    current_user 
    else 
    guest_user 
    end 
end 

ゲストユーザを管理する方法は、次のようになります。ゲストユーザの作成はうまくいくようです。しかし、この論理は決して起こりません:

# should delete the guest user and clear the session. 
if current_user 
    if session[:guest_user_id] && session[:guest_user_id] != current_user.id 
    logging_in 
    guest_user(with_retry = false).try(:destroy) 
    session[:guest_user_id] = nil 
    end 
    current_user 

私はゲストユーザセッションが私の新しいユーザーと競合し、(ゲストユーザがサインアップで削除されることは決してありませんので)、この考案のエラーが発生していることをかなり確信しています

Filter chain halted as :require_no_authentication rendered or redirected 

残りのゲストユーザロジックは、このリンクされたガイド:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-userと多かれ少なかれ正確に見えます。また、認証段落/例:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user#authentication-this-may-interfere-with-the-current_user-helperのコードを追加しました。

Deviseを使用してサインアップしてサインインするときに私のcurrent_or_guest_userを削除する方法はありますか?

更新

これは私のルートは、現在どのように見えるかです:

devise_for :users, controllers: { sessions: "users/sessions", registrations: "users/registrations" } 

root :to => 'public#index' 

resources :apps 

get 'users/show', to: "users#show" 
get 'users', to: "users#index" 

post 'guests/receive_guest', to: "guests#receive_guest" 

アップデート2

ガイドでは、次の文を持っている:

When (and if) the user registers or logs in, we delete the guest user and clear the session variable.

どのようにしてどこでやるべきか説明していません。私は再びに電話しなければならないと思います。しかし、私はDeviseに精通していないのでどこからわからないのですか?

アップデート3

はそれをもう少し明確にします。これが私が達成したいステップです。

  1. ユーザーがテストプロジェクトを作成します。
  2. テストプロジェクトの作成時に、ゲストユーザーとセッションが作成されます。ゲストユーザは、セッションが終了すると削除されます。
  3. ゲストユーザがサインアップすると、ログインしてテストプロジェクトを新しい実ユーザに割り当てる必要があります。
  4. ゲストユーザーは削除されます。
+0

'routes.rb'ファイルを投稿できますか? –

+0

@huzefabiyawarwala私は今それをしています。 – Anders

+2

私は自分のマシンに実装しようとしているものを試してみましたが、うまくいきますので、あなたが作成した追加のコードに何か不足しているかもしれません。可能であれば、上記のコードを削除し、あなたが現在持っているコントローラを投稿してください。それはより簡単にデバッグすることができます。 –

答えて

1

あなたの回答skahlertとSsouLlesSに感謝します。監視員の戦略をスキップすることは助けとなり、コールバックを定義することはきれいなアプローチのようです。それ以外にもいくつか問題がありました。

私のカスタムDeviseコントローラは決して呼び出されなかったということでした。その別の質問を作成しました:Rails 4 - devise_for not using custom controllers。解決策は、モーダルサインアップフォームで間違ったURLを使用したことでした。私のフォームは次のようになります。

= form_for(resource, as: resource_name, url: user_registration_path do |f| 

skahlertは私のアプリからwarden strategyを提案し、削除として次に私がしました。

カスタムデベロッパーが呼び出されたら、作成アクションを無効にすることにしました。完全にテストされていませんが、次のようになります。

# POST /resource 
def create 
    # Delete guest user and reset session. 
    new_user_from_guest = guest_user 
    guest_user(with_retry = false).try(:destroy) 
    session[:guest_user_id] = nil 

    build_resource(sign_up_params) 

    resource.save 
    yield resource if block_given? 
    if resource.persisted? 
    if resource.active_for_authentication? 
     set_flash_message :notice, :signed_up if is_flashing_format? 
     sign_up(resource_name, resource) 

     # Assign the guest users app to the new current user. 
     new_user_from_guest.apps.each do |app| 
     app.user_id = current_user.id 
     app.save! 
     end 
     respond_with resource, location: after_sign_up_path_for(resource) 
    else 
     set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
     expire_data_after_sign_in! 
     respond_with resource, location: after_inactive_sign_up_path_for(resource) 
    end 
    else 
    # Reset test user if signup fails, I have not tested this part yet. 
    guest_user 
    guest_user.apps << new_user_from_guest.apps 
    guest_user.save! 

    clean_up_passwords resource 
    set_minimum_password_length 
    respond_with resource 
    end 
end 

すべてが動作しているようです。いくつかのリファクタリングを行うことができ、おそらくSsouLlesSが彼の答えで提案したコールバックアプローチを試すことができました。

1

上記の答えは、あなたが定義する必要があなたのApplicationControllerにはコールバック

を定義し、そのようにようにコールバックを設定していないので、loggin_inメソッドが呼び出されていない、説明の不足:

define_callbacks :logging_in_user 
set_callback :logging_in_user, :before, :transfer_guest_user_actions_to_current_user 

def transfer_guest_user_actions_to_current_user 
    # todo 
end 

devise-guests gemを試しましたか?

ゲストログインを実装しているコントローラexampleをチェックしてください。それが役に立てば幸い。

+1

ありがとうございます。あなたのソリューションを調べます。それを行うためのきれいな方法のようです。私は今、どのようにそれをやったのか、以下の答えを作りました。少なくともそれを働かせました。改善のための提案をお気軽にお持ちください。 – Anders

1

この問題は、このガイドで参照されているguest_user監視戦略によって発生していると思います。あなたは厳密にそれが認証を必要としないのであれば

if authenticated && resource = warden.user(resource_name) 
    flash[:alert] = I18n.t("devise.failure.already_authenticated") 
    redirect_to after_sign_in_path_for(resource) 
end 

:ログインする前に、有効な監視員のセッションのための工夫をチェックして以来 、それはリダイレクトと表示されるフラッシュメッセージの原因となります!メソッドを使用すると、その戦略を無効にするだけで動作するはずです。

+0

ありがとうございます。それが助けになりました。私は下でやったすべての答えを作りました。あなたがより良いアプローチを知っているならば、それに改善を加えても構いません。ありがとう! – Anders

関連する問題