Rails:从控制器调用另一个控制器动作

我需要从控制器B调用控制器A中的创build操作。

原因是我从控制器B打电话时需要不同的redirect。

可以在Rails中完成吗?

您可以使用redirect到该操作:

redirect_to your_controller_action_url 

更多关于: Rails指南

只是呈现新的行动:

 redirect_to your_controller_action_url and return 

你提出的逻辑不是MVC,那么不是Rails,兼容。

  • 控制器呈现视图或redirect

  • 一个方法执行代码

从这些考虑,我build议你在你的控制器中创build方法,并从你的行动中调用它们。

例:

  def index get_variable end private def get_variable @var = Var.all end 

也就是说,你可以通过不同的控制器完成相同的操作,并在控制器B中从控制器A召唤一个方法

词汇是非常重要的,这就是为什么我坚持很多。

要使用另一个控制器,请执行以下操作:

 def action_that_calls_one_from_another_controller controller_you_want = ControllerYouWant.new controller_you_want.request = request controller_you_want.response = response controller_you_want.action_you_want end 

您可以使用url_for获取控制器和操作的URL,然后使用redirect_to转到该URL。

 redirect_to url_for(:controller => :controller_name, :action => :action_name) 

调用另一个控制器操作是不好的做法。

你应该

  1. 在你的控制器B中复制这个动作
  2. 将其作为模型方法进行包装,然后将其共享给所有控制器或
  3. 你可以在控制器A中扩展这个动作

我的想法:

  1. 第一种方法不是DRY,而是比调用另一个动作更好。
  2. 第二种方法是好的和灵活的。
  3. 第三种方法是我经常做的事。 所以我会举个小例子。

     def create @my_obj = MyModel.new(params[:my_model]) if @my_obj.save redirect_to params[:redirect_to] || some_default_path end end 

所以你可以发送到这个动作redirect_to参数,它可以是你想要的任何path。

也许这个逻辑可以提取成一个帮手? 助手可用于所有课程,不转移控制权。 你可以在它内部检查,也许是为了控制器的名字,看看它是如何被调用的。

您可以在一个操作中调用另一个操作,如下所示:

redirect_to动作:'action_name'

 class MyController < ApplicationController def action1 redirect_to action: 'action2' end def action2 end end 

组成救援!

考虑到原因,而不是跨控制器调用动作,应该devise控制器来分离代码的共享和自定义部分。 这将有助于避免代码重复和打破MVC模式。

虽然这可以通过很多方式来完成,但使用关注点( 构图 )是一种很好的做法。

 # controllers/a_controller.rb class AController < ApplicationController include Createable private def redirect_url 'one/url' end end # controllers/b_controller.rb class BController < ApplicationController include Createable private def redirect_url 'another/url' end end # controllers/concerns/createable.rb module Createable def create do_usefull_things redirect_to redirect_url end end 

希望有所帮助。

将这些function从控制器中分离出来并放入模型文件中。 然后将模型文件包含在控制器中。