4

Railsスキャフォールディングを使用して名前空間モデルを作成すると、2つのファイルが取得されます。たとえば、次の足場:

rails generate model Staff::Location name:string address:string

これらのファイルを生成します:

/app/models/staff.rb    
module Staff
  def self.table_name_prefix
    "staff_"
  end
  ...

/app/models/staff/location.rb
class Staff::Location < ActiveRecord::Base
  ...

RailsがStaffモジュールをアンロードし、リロードしない開発モードで問題が発生しています。これにより、table_name_prefixがないために、Locationがそのテーブルにアクセスできないなどのいくつかの厄介なバグが発生します。多態的な関係などを介してモデルに直接アクセスしないと、問題が発生するようです。

モジュールを一貫してロードすることができないようです。これは、名前空間モデルを実行するためのベストプラクティスの方法ですか?もしそうなら、私は何が欠けていますか?

4

2 に答える 2

2

Rails 3.2.2では問題を再現できませんでしたが、以前はこのような問題に遭遇しました。開発モードでこの問題をハックする一般的な方法は、ActionDispatchコールバックを使用することです。これをに追加しconfig/environments/development.rbます:

MyApp::Application.configure do
  ActionDispatch::Callbacks.before do
    load Rails.root.join('app', 'models', 'staff.rb')
  end
end

そのブロックで行うことはすべて、各リクエストの前に実行されるため、開発モードでのみ実行するようにしてください。†そうしないと、本番環境でパフォーマンスが低下することになります。

staff.rbファイル内とStaffモジュール自体にメッセージを記録しましたが、両方のメッセージが各リクエストのログに表示されました。


to_prepareコールバックを使用してみました。これは、がfalseの場合にのみ、各リクエストの前にコードを実行するための文書化された方法のようcache_classesです。しかし、それはアプリケーションを再起動した後にのみ実行されるように見えました。彼は私が使用したものとは少し異なる構文を使用していますが、これに関して少なくとも1つの未解決のStackOverflowの質問があります。仕事に取り掛かることができればto_prepare、の代わりにそれをお勧めしbeforeます。

于 2012-04-15T01:02:07.117 に答える
2

約1年後、私はついにこの質問に対する答えを見つけました。この回答は、特にレール3.1を対象としています。Rails3.2で問題があるかどうかはわかりません。

モデルを設定するときに問題が発生します。スキャフォールディングが使用されている場合、ヘルパーファイルは生成されません。これは通常/app/helpers/staff/location_helper.rbにあります。このファイルを設定するには、次の2つの方法があります。

module Staff::LocationHelper
  ...
end

module Staff
  module LocationHelper
    ...
  end
end

Rails 3.1では、特にヘルパーの場合、最初のソリューションを使用する必要があります。railsプロジェクトの他の部分で名前空間を使用する他のモジュールに使用する必要はありません。実際、ルビーの一部の構造には2番目のソリューションが必要です。

ヘルパーを宣言するときに2番目のソリューションを使用する場合、場合によっては、ヘルパーファイルのStaffモジュールが/app/models/staff.rbのモジュールをオーバーライドします。ファイル内の空のStaffモジュールにサイレントに置き換えられます。ヘルパーが常にロードされるとは限らないため、これは100%の確率で発生するわけではありません。

于 2013-03-21T15:01:35.823 に答える