2

私の誰Usersもがhas_manyと関係がありCharacterます。アプリケーションを使用する前に、まずメインとして1つのキャラクターを選択する必要があるためmembers、メインキャラクターを選択するまで、コントローラーのshowメソッドにリダイレクトし続けます。

私のアプローチは機能しますが、たとえば誰かがメインキャラクターを選択する前にログアウトしたい場合、リダイレクトし続けるという問題がありますmember_pathdeviseこのルールとコントローラー全体の例外にコントローラーを追加するにはどうすればよいですかmembers

class ApplicationController < ActionController::Base
  protect_from_forgery

    before_filter :check_for_main
    skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out]

    # Check if user has a main character selected
    private
    def check_for_main

        # Check signed in user
        if user_signed_in?

            # Check associated characters if any are set as main
            redirect_to member_path(current_user.id), :alert => "Please select your main character."
            unless current_user.characters.any?(&:main)

            end
        end
    end

end
4

2 に答える 2

1

MembersControllerあなたとUsersControllerあなたの両方で、フィルターをスキップする必要があるコントローラーのアクションを指定するオプションを使用する必要がありますskip_before_filter :check_for_main:only現在持っている

skip_before_filter :check_for_main, :only => [:members => :show, :users => :sign_out]

しかし、それは代わりにすべきです

# in MembersController
skip_before_filter :check_for_main, :only => [:show]

# in UsersController
skip_before_filter :check_for_main, :only => [:sign_out]    
于 2013-03-23T18:02:29.023 に答える
1

別のコントローラーをサブクラスの Devise コントローラーに 1 行だけ追加してコードを汚染したくありませんでした: skip_before_filter. 私の最初の試みは、skip_before_filterdevise コントローラー自体を追加することでしたが、それは本当に避けるべきです。

とにかく実行rake routesすると、デバイスコントローラーが実際にはdevise/controller_name常にdevise/ prefix名前の前に付けられていることが示されます。デバイスコントローラーをさらに拡張するつもりはなかったので、意味のある唯一のことは、メソッド自体に条件ステートメントを追加して、デバイスパッケージからのリクエストをスキップすることでした。

@Stuart M他のすべてのコントローラーについては、アドバイスに従いました。

私の新しいコード:

class ApplicationController < ActionController::Base
    protect_from_forgery

    before_filter :check_for_main

    # Check if user has a main character selected
    private
    def check_for_main

        # Check signed in user
        if user_signed_in?

            if not params[:controller].to_s.include? "devise"
                # Check associated characters if any are set as main
                if not current_user.characters.any?(&:main)
                    redirect_to member_path(current_user.id), :alert => "Please select your main character."
                end
            end
        end
    end

end
于 2013-03-26T14:50:06.707 に答える