防止用户在Rails中直接执行控制器操作

时间:2010-11-24 03:27:45

标签: ruby-on-rails explicit

我有一种情况需要阻止用户明确调用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控制器操作只是我想要执行的普通代码,但前提是重定向发生在应用程序控制器内部。

2 个答案:

答案 0 :(得分:0)

将addBuilding方法放在以protected开头的行下,如下所示

protected
def addBuilding
   #your code
end

享受!

编辑:除此之外,您可能还想在控制器中使用before_filter ...我会尽快发布确切的语法。

 before_filter :addBuilding, :only => :method_name

method_name是一个方法,可以从中访问addBuilding,添加此行后,其他任何方法都无法访问此方法。

编辑:好的,基于您提供的信息,protected无法正常工作,因为如果我们将您的秘密行动置于protectedtavern控制器下可以访问它。

编辑:请考虑使用会话来检查用户在尝试执行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)