2010-11-24 42 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