我有一种情况需要阻止用户明确调用say / town / addBuilding。 Town是我的控制器,addBuilding是执行的操作。
现在,问题是这个动作应该只在我的程序代码中执行,而不是由请求执行它的用户执行。此外,此操作像回调一样执行。在我的application_controller中,当满足某些条件时,将触发控制器操作并且存在重定向。在PHP中,一个简单的守卫就像定义一个守卫并检查它就足够了。在rails中是否有相同的东西,如果是,那么实现它的最佳方法是什么?
Thanx阅读,感谢您的帮助:)。
编辑:我正在粘贴一些代码以使其更清晰,请注意/ town / 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
tavern控制器操作只是我想要执行的普通代码,但前提是重定向发生在应用程序控制器内部。
答案 0 :(得分:0)
将addBuilding方法放在以protected开头的行下,如下所示
protected
def addBuilding
#your code
end
享受!
编辑:除此之外,您可能还想在控制器中使用before_filter ...我会尽快发布确切的语法。
before_filter :addBuilding, :only => :method_name
method_name是一个方法,可以从中访问addBuilding,添加此行后,其他任何方法都无法访问此方法。
编辑:好的,基于您提供的信息,protected
无法正常工作,因为如果我们将您的秘密行动置于protected
仅tavern
控制器下可以访问它。
编辑:请考虑使用会话来检查用户在尝试执行monsterAttack
操作时是否拥有有效会话。
答案 1 :(得分: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)