Rails 为大礼包装饰控制器

Rails decorating controllers for spree

我想是个简单的 ruby 问题。

为什么会这样?:

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

的操作 'navigation'

模块缺少什么?

V1::TaxonsController.class_eval do
  def navigation
  end
end

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

class V1::TaxonsController < ApplicationController
end

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

TaxonsController.class_eval do
  def navigation
  end
end

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

希望对您有所帮助。