在CommentsController中调用一个动作,来自CommentsController - Rails

时间:2010-11-30 20:28:06

标签: ruby-on-rails

情况:

我有以下内容:

class Game < ActiveRecord::Base
   has_many :turns

   def calculate_score
      #return score of all turns played so far
   end       
end

class Turn < ActiveRecord::Base
   belongs_to :game
end

...与相应的控制器。 (这不完全是我所拥有的,但我的问题非常笼统。问题标题显示了另一种类似的情况)

当我在 / game /:id (显示动作)时,我显示所有转弯,并使用AJAX编辑就地更新任何转弯。更新转弯会调用 TurnsController 更新方法。

问题:

在转弯更新后,如何从 TurnsController 调用 GameController 中的操作?

我需要在 GameController 中使用一个名为“turn_updated”的动作来检查所有转弯并对收集game.turns执行操作。

谢谢!

PS:显然我是Rails的新手,所以我不能更具体,因为我不确定如何表达我的问题,或者说什么是可能的。


更新

感谢目前为止的答案。

我一直在使用redirect_to,但我的问题是更新是一个AJAX调用。它需要渲染:text =&gt;某些条件下为@ turn.value ,其他情况下为 redirect_to 。由于它是一个AJAX调用,redirect_to将显示转向值的div替换为新地址的全部内容。

我现在正在尝试这些方法:

#turn update action
def update
   url = url_for(:controller => 'games', :action => 'turn_updated', :id => @turn.game_id)
   render :partial => 'shared/redirect.js.erb', :locals => {:url => url}
end

,部分是:

<script type="text/javascript">window.location.replace(<%= url %>);</script>

我越来越接近这一点,但似乎有点脆弱...... 例如,如果我用 alert替换部分的JS(“Works!”); 它会执行警报,但重定向并不总是发生。

2 个答案:

答案 0 :(得分:0)

在控制器中,使用重定向:

def my_turn_action
  # ...
  redirect_to :controller => :game, :action => :turn_updated and return
end

在视图中(即,如果您只想要指向其他控制器的链接):

<%= link_to :controller => :game, :action => :turn_updated %>

答案 1 :(得分:0)

我想你可能需要在这里重新考虑你的方法。控制器并不意味着彼此通信。如果您想在转弯更新后执行某些操作,请将其作为模型上的方法并从 TurnsController 中调用它。你甚至可以在模型中添加一个after_save回调,但要注意回调会导致混乱,特别是如果它们很复杂的话。

仔细考虑哪个方法取决于哪个对象。它属于哪里?控制器应该相当直接:获取资源并显示它(用于GET请求),或执行一个操作并重定向回GET页面。如果您想要做的事情也不属于模型,请创建服务类或不同的模型。

我希望这会有所帮助:)