Rails分割控制器之间的动作

时间:2013-09-02 02:04:30

标签: ruby-on-rails model-view-controller controller ruby-on-rails-4

这个问题相对简单但不太局部,因为它可以外推到很多控制器动作。

我有一个游戏控制器。

它(游戏)有很多行星。

到目前为止,我对每个控制器中的内容感到困惑。我认为必须有一个轨道方式来做它,这将保持行星控制器中的行星动作,但我不知道该怎么做。

编辑(注意这还不是游戏玩法):

更具体地说,这是对我坚持的问题的更好描述。我不确定如何对其进行编码(或者如果这是一种非常有效的方法)

  • 点击页面上的播放按钮
    • 游戏控制器中的操作运行一些逻辑
    • 然后重定向到行星的索引页面
      • 单击某个星球将执行show动作并转到show view。

所以在这个例子中,我理解前两点和最后一点。但我不明白重定向是否有意义

游戏控制器:

def play
  game =  Game.find(params[:id])
  # do stuff
  redirect planets_path(game)
end

行星控制器:

def index(game)
  @planets = game.planets
end

def show
  @planet = Planet.find(params[:id])
end

实例变量将用于相应的视图中。此外,planets_path将链接到路径文件中的行星索引控制器。

3 个答案:

答案 0 :(得分:1)

重定向是有道理的。 Rails惯例是以RESTful方式构建资源。因此对于游戏资源,它将具有“播放”的动作。该动作执行其逻辑(我假设它将是游戏的设置逻辑)然后将指导用户自己启动游戏。如果这个初始页面是可用行星列表,那么将它们重定向到planets_path是有意义的。

也许你应该重定向到GameController #show?如果用户在开始播放后可以执行其他操作,我会这样做。否则,我会将此操作用于配置和有关游戏本身的其他信息,并为Game和Planet控制器提供可玩的操作。

如果你在游戏中将星球设为nested resource,那么路线就像game_planets_path(game)一样,/games/1/planets的网址为PlanetsController#indexgame_planet_path(game, planet)的网址为/games/1/planets/1 Planetscontroller#show的网址{{1}}。这有助于了解这些行星属于那个游戏。

答案 1 :(得分:0)

这里Association Basics您将找到Rails中所有关联类型的示例以及如何使用它们

答案 2 :(得分:0)

像骨干这样的前端js框架可能是一种解决方案。

它使用后端以json格式检索数据,然后更新视图。

这样你就可以将所有行星的行为保留在行星控制器中,只需将json格式的响应实现为API。