即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

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

栈溢出 djGrill 13℃ 0评论
本文目录
[隐藏]

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?

2.被采纳答案

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

3.其他高票答案

3.1.第1个答案

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.

3.2.第2个答案

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)

3.3.第3个答案

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

3.4.第4个答案

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.

转载请注明:CodingBlog » 从控制器调用另一个控制器动作

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情