首页 文章

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

提问于
浏览
100

我需要从控制器B调用控制器A中的create动作 .

原因是当我从控制器B呼叫时,我需要以不同的方式重定向 .

可以在Rails中完成吗?

9 回答

  • 6

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

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

    也许逻辑可以被提取到帮手?所有类都可以使用帮助程序,并且不会转移控制权 . 您可以在其中检查,也许是控制器名称,以查看它是如何被调用的 .

  • 61

    你提出的逻辑不是MVC,而是Rails,兼容 .

    • 控制器呈现视图或重定向

    • 方法执行代码

    从这些考虑,我建议您在控制器中创建方法并从您的操作中调用它们 .

    例:

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

    也就是说你可以通过不同的控制器做同样的事情,并在控制器B中从控制器A召唤一个方法 .

    词汇非常重要,这就是我坚持的原因 .

  • 40

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

    redirect_to action:'action_name'

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

    Composition救援!

    鉴于原因,不应该跨控制器调用操作,而应设计控制器以分离代码的共享和自定义部分 . 这将有助于避免代码重复和破坏MVC模式 .

    虽然可以通过多种方式完成,但使用问题(composition)是一种很好的做法 .

    # 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
    

    希望有所帮助 .

  • 38

    您可以使用重定向到该操作:

    redirect_to your_controller_action_url
    

    更多信息:Rails Guide

    要呈现新动作:

    redirect_to your_controller_action_url and return
    
  • -5

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

    你应该

    • 在控制器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 param,它可以是你想要的任何路径 .

  • 1

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

    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
    
  • 5

    将这些功能与控制器分开并将它们放入模型文件中 . 然后在控制器中包含模型文件 .

相关问题