大礼包的Rails装饰控制器

时间:2018-07-16 19:00:51

标签: ruby-on-rails ruby spree

我猜是简单的红宝石问题。

这为什么起作用?:

module Spree
  module Api
    module V1
      V1::TaxonsController.class_eval do
        def navigation
        end
      end
    end
  end
end

当我这样做时:

module Spree
  module Api
    module V1
      TaxonsController.class_eval do
        def navigation
        end
      end
    end
  end
end

我收到“ UnknowAction”,找不到Spree :: Api :: V1 :: TaxonsController的动作“导航”

模块缺少什么?

1 个答案:

答案 0 :(得分:1)

V1::TaxonsController.class_eval do
  def navigation
  end
end

在V1 :: TaxonsController类上创建导航实例方法。当您使用Ruby的范围解析运算符(::)省略V1时,导航实例方法不是在V1 :: TaxonsController类上创建的,而是在TaxonsController类上创建的。我猜想,如果它是Rails控制器,则TaxonsController类的定义如下:

class V1::TaxonsController < ApplicationController
end

这表明上述TaxonsController类位于Rails应用程序(app / controllers / V1)的V1目录中。因此,如果您使用class_eval在TaxonsController类上定义一个额外的方法,如下所示:

TaxonsController.class_eval do
  def navigation
  end
end

然后将不会在app / controllers / V1中的TaxonsController上定义导航方法。

我希望这会有所帮助。