1.原始问题：Rails: call another controller action from a controller
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.
Can it be done in Rails?
You can use a redirect to that action :
More on : Rails Guide
To just render the new action :
redirect_to your_controller_action_url and return
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.
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.
You can use
url_for to get the URL for a controller and action and then use
redirect_to to go to that URL.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
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
This is bad practice to call another controller action.
- duplicate this action in your controller B, or
- wrap it as a model method, that will be shared to all controllers, or
- you can extend this action in controller A.
- First approach is not DRY but it is still better than calling for another action.
- Second approach is good and flexible.
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.