3

名前空間に含まれる Rails 3.2.8 モデルがあります。以前は、名前空間がテーブル名がどのように見えるかに自動的に展開されていたと確信しています。たとえば、Module::Model は、データベースでは module_model になります。

なんらかの理由で、これがレールアプリケーションでは起こらないという問題があります。移行、モデル、およびコントローラーはすべて名前空間に存在しますが、モデルがテーブルを探すときに、テーブルのプレフィックスを無視し、データベースが見つからないと文句を言います。

これが例です

module Magazine
  def self.table_name_prefix
    'magazine_'
  end
end

module Magazine
  class Paper < ActiveRecord::Base
    #some stuff here
  end
end

Magazine::Paper でクエリを実行すると、「maganzine_paper」ではなく「paper」というテーブルが検索されます。これにより、アプリケーション全体で奇妙な動作が発生します。また、モデルで self.table_name を使用してテーブル名を手動で設定しようとしましたが、これはモデルが正しいテーブルを見つけることしかできません。コメントなどの紙の下に何かをネストすると、ルートは存在しないルートを探します。

これがルートの中にあるものです。コメントは /magazine/papers/1/comments に送られるべきですが、/magazine/comments というルートを探します

namespace :magazine do
  resources :papers do 
    resources :comments
  end
end

何が起こっている?

アップデート:

わかりましたので、それを理解しましたが、それを無視するか、何が原因かを確認する必要があるかどうかはわかりません。エンジン名はマガジンで、エンジン内にマガジンというモデルの名前空間を作成しますが、これが問題を引き起こします。Rails はエンジン名に似た名前空間名を持つことはできませんか?

4

2 に答える 2

0

書くだけなら

namespace :magazine do
 resources :papers do 
  resources :comments
 end
end

rake routes を実行すると、適切な URL を探していることがわかります。探していると言うときは/magazine/comments、ファイルのどこかに別のルートを書いたに違いありません。あなたが書くとき

module Magazine
 def self.table_name_prefix
  'magazine_'
 end
end

また、同じモジュール名でモデルを作成すると、同じモジュールMagazineがその中の異なる内容に置き換えられます。Magazine モジュール内にモデル Paper を記述する代わりに、次の方法でモデル Paper 内にモジュールを含めます。

class Paper < ActiveRecord::Base
  include Magazine
  #some stuff here
end

これにより、アプリケーションの起動時にモデルがロードされたときに table_name_prefix メソッドが確実に呼び出されます。

于 2012-08-13T09:38:42.583 に答える