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)
调用另一个控制器操作是不好的做法。
你应该
- 在你的控制器B中复制这个动作
- 将其作为模型方法进行包装,然后将其共享给所有控制器或
- 你可以在控制器A中扩展这个动作
我的想法:
- 第一种方法不是DRY,而是比调用另一个动作更好。
- 第二种方法是好的和灵活的。
-
第三种方法是我经常做的事。 所以我会举个小例子。
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从控制器中分离出来并放入模型文件中。 然后将模型文件包含在控制器中。