2016-09-22 47 views
0

在同一模块内的模型(APP /模型/ OC /pedido.rb和app /模型/ OC/encuadernacion_papel .RB)导轨5命名空间需要(在控制器)或不是(模型)来指定的模块名称

我可以在pedido.rb做到这一点:

class Oc::Pedido < ActiveRecord::Base 

    has_many :encuadernaciones_papel, class_name: "EncuadernacionPapel" 

- >无 “超频::” 在CLASS_NAME:has_many :enc... class_name: "Oc::EncuadernacionPapel"

所以,Rails的理解EncuadernacionPapel是内Ø C模块中

我woluld喜欢省略 “超频::” 模块名,内 “OC” 控制器时,呼叫Pedido类,但它崩溃:

应用程序/控制器/ OC /firmas_controller.rb

class Oc::LiquidacionController < ApplicationController 

    Pedido.find(... 

相反,我必须注明:

Oc::Pedido.find(... 

为什么呢?它是否正确?或我amb缺少什么?

非常感谢

+0

这是由于嵌套和不断查找红宝石的方式。 http://cirw.in/blog/constant-lookup.html – max

+0

感谢您的回应,好吧,我已经阅读了这样的帖子,我认为我理解模型嵌套等等,但是我认为比Rails应用程序控制器和模型可能共享相同的模块...或者我应该在模型和控制器中执行“Oc”的阳极模块父项吗? –

+0

如果您将控制器声明为“模块Oc','class LiquidacionController',它将从'Oc'模块中查找'Pedido'。 – max

回答

1

如果试图重新打开该模块时采取的快捷方式:

class Oc::LiquidacionController 
    def show 
    @pedido = Pedio.find(params[:id]) 
    end 
end 

你会得到一个NameError: uninitialized constant Oc::LiquidacionController错误,因为OcModule.nesting。这是因为跳过的外部名称空间不会被添加到Module.nesting

如果改为使用 “手写” 的形式:

module Oc 
    class LiquidacionController 
    def show 
     @pedido = Pedio.find(params[:id]) 
     logger.info(Module.nesting.inspect) 
    end 
    end 
end 

Module.nesting会给你[Oc::LiquidacionController, Oc]

相关问题