我有以下内容:
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!”); 它会执行警报,但重定向并不总是发生。
答案 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页面。如果您想要做的事情也不属于模型,请创建服务类或不同的模型。
我希望这会有所帮助:)