1

我有一种情况,我需要阻止用户明确调用说/town/addBuilding。Town 是我的控制器,而 addBuilding 是执行的操作。

现在,问题是这个动作应该只在我的程序代码中执行,而不是由请求执行它的用户执行。此外,这个动作像回调一样执行。在我的 application_controller 中,当满足某些条件时,将触发控制器操作并进行重定向。在 php 中,一个简单的守卫,比如定义一个守卫并检查它就足够了。rails 中是否有等效的东西,如果有,实现它的最佳方法是什么?

感谢阅读,感谢您的帮助:)

编辑:我正在粘贴一些代码以使其更清晰,请注意 /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

酒馆控制器操作只是我想要执行的纯代码,但前提是重定向发生在应用程序控制器内部。

4

2 回答 2

0

将addBuilding方法放在以protected开头的一行下面,如下

protected
def addBuilding
   #your code
end

享受!

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

 before_filter :addBuilding, :only => :method_name

method_name 是可以访问 :addBuilding 的方法,在此行添加后没有其他方法可以访问该方法。

编辑:好的,所以根据您提供的信息,protected不会起作用,因为如果我们将您的秘密操作置于protected只有tavern控制器可以访问它。

编辑:请考虑使用会话来检查用户在尝试执行monsterAttack操作时是否有有效的会话..

于 2010-11-24T03:29:29.860 回答
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)
于 2010-11-24T12:42:53.277 回答