Rails4: Methods shared by multiple controllers

2019-01-25 10:55发布

I have two controllers, i.e 1) carts_controller 2) orders_controller

class CartsController < ApplicationController
  helper_method :method3

  def method1
  end

  def method2
  end

  def method3
    # using method1 and method2
  end
end

Note: method3 is using method1 and method2. CartsController has showcart.html.erb view which is using method3 and works fine.

Now in order's view, I need to display cart (showcart.html.erb) but as the helper method3 is defined in carts_controller so it cannot access it.

How to fix it ?

2条回答
啃猪蹄的小仙女
2楼-- · 2019-01-25 11:39

You cannot use methods from other controller, because it's not instantiated in current request.

Move all three methods to parent class of both controllers (or ApplicationController), or to a helper, so they will be accessible to both

查看更多
迷人小祖宗
3楼-- · 2019-01-25 11:55

As you are using Rails 4, the recommended way of sharing code among your controllers is to use Controller Concerns. Controller Concerns are modules that can be mixed into controllers to share code between them. So, you should put the common helper methods inside the controller concern and include the concern module in all of your controllers where you need to use the helper method.

In your case, as you want to share method3 between two controllers, you should put it in a concern. See this tutorial to know how to create concern and share codes/methods among controllers.

Here are some codes to help you get going:

Define you controller concern:

# app/controllers/concerns/your_controller_concern.rb
module YourControllerConcern
  extend ActiveSupport::Concern

  included do
    helper_method :method3
  end

  def method3
    # method code here
  end
end

Then, include the concern in your controllers:

class CartsController < ApplicationController
  include YourControllerConcern
  # rest of the controller codes
end

class OrdersController < ApplicationController
  include YourControllerConcern
  # rest of the controller codes
end

Now, you should be able to use method3 in both controllers.

查看更多
登录 后发表回答