2016-09-22 3 views
0

/OC/encuadernacion_papel .RB)レール5名前空間(コントローラ)に必要かどうか(モデル)で指定するモジュール名と同じモジュール内のモデル(APP /モデル/ <strong>OC</strong> /pedido.rbアプリ/モデルにおいて

私はpedido.rbでこれを行うことができます。

class Oc::Pedido < ActiveRecord::Base 

    has_many :encuadernaciones_papel, class_name: "EncuadernacionPapel" 

- > "Ocの::" CLASS_NAMEでなし:has_many :enc... class_name: "Oc::EncuadernacionPapel"

をので、RailsはEncuadernacionPapelがOの範囲内であることを理解Cモジュール

私は "のOC ::" 省略するモジュール名を、 "Ocの" コントローラのコールPedidoクラス内の好きwoluld、それがクラッシュ:

アプリ/コントローラ/ OC /firmas_controller.rb

class Oc::LiquidacionController < ApplicationController 

    Pedido.find(... 

代わりに私が指定する必要があります。

Oc::Pedido.find(... 

なぜですか?これは正しいです?または私は何かを逃している?

どうもありがとう

+0

これは、ルビのネストと定数ルックアップの仕組みによるものです。 http://cirw.in/blog/constant-lookup.html – max

+0

応答のためにありがとう、まあ、私はこのような記事を読んで、私はモデルネスティングなどを控えていると思うが、私はRailsアプリケーションコントローラとモデル同じモジュールを共有するかもしれません...またはモデルとコントローラで "Oc"のanoderモジュールの親を行う必要がありますか? –

+0

コントローラを 'module Oc'、' class LiquidacionController'として宣言すると、 'Oc'モジュールから' Pedido'を検索します。 – max

答えて

1

あなたはモジュールの再開時にショートカットを取るしようとした場合:

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

OcModule.nestingではありませんので、あなたはNameError: uninitialized constant Oc::LiquidacionControllerエラーが発生します。これは、スキップされた外部名前空間が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]を与えるだろう。

関連する問題