Rails。多个控制器共享的方法

问题描述 投票:9回答:2

我有两个控制器,即1) carts_controller2) orders_controller。

class CartsController < ApplicationController
  helper_method :method3

  def method1
  end

  def method2
  end

  def method3
    # using method1 and method2
  end
end

注。method3 是使用 method1method2.CartsControllershowcart.html.erb 视图使用方法3,工作正常。

现在在订单视图中,我需要显示购物车(showcart.html.erb)但作为帮手的 method3 定义为 carts_controller 所以无法访问它。

如何解决这个问题?

ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5
2个回答
39
投票

由于你使用的是Rails 4(这种方法在新版本的Rails中也应该适用),推荐的在控制器之间共享代码的方法是使用Controller Concerns。Controller Concerns是一种模块,可以混合到控制器中,在它们之间共享代码。所以,你应该把常用的辅助方法放在控制器关注里面,并在所有需要使用辅助方法的控制器中加入关注模块。

在你的案例中,由于你想共享 method3 两个控制器之间,你应该把它放在一个关注。参见 本教程 要知道如何在控制器之间创建关注和共享代码方法。

以下是一些代码,可以帮助你入门。

定义你的控制器关注。

# 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

然后,在你的控制器中加入关注。

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

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

现在,你应该能够使用 method3 的方法。


0
投票

你不能使用其他控制器的方法,因为它没有在当前请求中被实例化。

将这三个方法移到两个控制器的父类(或ApplicationController)中,或者移到一个帮助器中,这样它们就可以被两个控制器访问。

© www.soinside.com 2019 - 2024. All rights reserved.