2

我的Users中的每一個與Character都有has_many關係。現在,在他們可以使用應用程序之前,我需要他們先選擇一個角色作爲他們的主角,因此我想繼續將他們重定向到控制器顯示方法,直到他們選擇主角色。過濾器爲整個控制器分配異常之前

我的方法可行,但有人想要在選擇主要角色之前註銷,它會將它們重定向到member_path。如何將devise控制器添加到此規則的例外情況以及我的整個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 

回答

1

我不想通過增加另一個控制器子類化設計只爲一個線控器污染我的代碼:skip_before_filter。我的第一個嘗試是添加skip_before_filter來設計控制器的自我,但你應該真的避免這一點。

無論如何運行rake routes顯示設計控制器實際上名稱前​​始終與名稱前的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 
1

在這兩個你MembersControllerUsersController你應該有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]  
+0

我知道,我的問題是但是,我沒有用戶控制器。 – 2013-03-23 18:32:14

+0

':sign_out'動作是什麼控制器的一部分? – 2013-03-23 18:48:43

+0

它是我無法訪問的設備控制器的一部分。 – 2013-03-23 18:50:07