2010-11-24 43 views
1

我有一種情況,我需要阻止用戶顯式調用say/town/addBuilding。 Town是我的控制器,addBuilding是執行的動作。防止用戶在Rails中直接執行控制器動作

現在,這個動作應該只在我的程序代碼中執行,而不是由用戶請求執行它。而且,這個動作像回調一樣執行。在我的application_controller中,當滿足一些條件時,控制器動作被觸發並且有重定向。在php中,一個簡單的守衛就像定義一個守衛並檢查它就足夠了。在rails中是否有相同的東西,如果是的話,實現它的最好方法是什麼?

感謝名單的閱讀,我感謝你的幫助:)

編輯:我粘貼一些代碼,以使其更清晰,注意/鎮/ addBuilding就是一個例子,下面的控制器名稱和動作名稱不同。

現在,這是實際的應用程序控制器代碼,它是我編碼的瀏覽器遊戲的一部分。

def checkQuest 
if TavernQuest.hasQuest(current_user) 
    quest = TavernQuest.getQuest(current_user) 
    if quest.end_time < Time.now # get quest info and check if the quest has been completed 
    TavernQuest.deleteQuest(current_user) 
    redirect_to :controller => 'tavern', :action => 'monsterAttack' 
    end 
end 
end 

小酒館控制器動作就是,我要執行明碼,但前提是重定向發生在應用控制器內。

回答

0

看來你正試圖把邏輯到控制器實際上應該屬於模型或圖書館。

爲什麼我這麼說:除了current_user和重定向之外,所有的代碼都與你的模型(知識應該在的地方)相關,而不是你的控制器。你的模型知道用戶的任務何時到期。

實現示例:

class TavernQuest 

    def self.user_quest_is_expired?(user) 
    quest = getQuest(current_user) 
    if quest && quest.end_time < Time.now 
     TavernQuest.deleteQuest(current_user) 
     true 
    else 
     false 
    end 
    end 
end 

和控制器,你只需要編寫

redirect_to :controller => 'tavern', :action => 'monsterAttack' if TavernQuest.user_quest_is_expired?(current_user) 
0

將下與保護開始行addBuilding方法,如下

protected 
def addBuilding 
    #your code 
end 

享受!

編輯:除此之外,你可能還想在你的控制器中使用before_filter ...我將盡快發佈確切的語法。

before_filter :addBuilding, :only => :method_name 

method_name是從哪個方法:addBuilding可以訪問,沒有其他方法在此行中添加後可以訪問此方法..

編輯:好了,根據您所提供的信息,protected將不起作用,因爲如果我們將您的祕密行動置於protected之下,則只有tavern控制器可以訪問它。

編輯:請考慮使用會話檢查,如果用戶有一個有效的會話,當他們嘗試執行monsterAttack動作..

+0

你好Jasdeep和thanx的真正快速回復。 問題是,我重定向到像redirect_to:controller =>'town',:action =>'通過我的application_controller添加構建(通過回調,如我在第一篇文章中提到的),因此私有,受保護的不工作。before_filter可以工作,但會在模型內部進行重定向(通過method_name我的意思是,因爲我最終必須調用addbuilding)。我會看看,thanx :) – Spyros 2010-11-24 03:40:08

+0

沒問題Spyros,確實需要一些時間來標記這個答案爲接受的情況下,它爲你工作.. :) – 2010-11-24 03:41:08