Rails: call another controller action from a controller

后端 未结 9 1006
眼角桃花
眼角桃花 2020-11-27 11:47

I need to call the create action in controller A, from controller B.

The reason is that I need to redirect differently when I\'m calling from controller B.

相关标签:
9条回答
  • 2020-11-27 12:04

    To use one controller from another, do this:

    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
    
    0 讨论(0)
  • 2020-11-27 12:04

    This is bad practice to call another controller action.

    You should

    1. duplicate this action in your controller B, or
    2. wrap it as a model method, that will be shared to all controllers, or
    3. you can extend this action in controller A.

    My opinion:

    1. First approach is not DRY but it is still better than calling for another action.
    2. Second approach is good and flexible.
    3. Third approach is what I used to do often. So I'll show little example.

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

    So you can send to this action redirect_to param, which can be any path you want.

    0 讨论(0)
  • 2020-11-27 12:07

    The logic you present is not MVC, then not Rails, compatible.

    • A controller renders a view or redirect

    • A method executes code

    From these considerations, I advise you to create methods in your controller and call them from your action.

    Example:

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

    That said you can do exactly the same through different controllers and summon a method from controller A while you are in controller B.

    Vocabulary is extremely important that's why I insist much.

    0 讨论(0)
  • 2020-11-27 12:09

    You can use a redirect to that action :

    redirect_to your_controller_action_url
    

    More on : Rails Guide

    To just render the new action :

    redirect_to your_controller_action_url and return
    
    0 讨论(0)
  • 2020-11-27 12:12

    Perhaps the logic could be extracted into a helper? helpers are available to all classes and don't transfer control. You could check within it, perhaps for controller name, to see how it was called.

    0 讨论(0)
  • 2020-11-27 12:12

    Separate these functions from controllers and put them into model file. Then include the model file in your controller.

    0 讨论(0)
提交回复
热议问题