2012-04-04 61 views
4

当您使用导轨脚手架创建名称空间模型时,会得到两个文件。例如,该支架:在导轨名称空间模型中丢失名称空间信息

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 
    ... 

我遇到的时候开发模式下轨卸载模块的工作人员的问题,从来没有重新加载。这会导致一些恼人的错误,例如由于缺少table_name_prefix,Location无法访问它的表。当我不直接访问模型时,例如通过多态关系,问题似乎就出现了。

我似乎无法获得一致的基础上加载模块。这是命名空间模型的最佳实践方式吗?如果是这样,我错过了什么?

+0

你可以给一个代码产生这个错误的例子吗?也许其中一个似乎经常失败的关系? – Brandan 2012-04-14 23:50:55

回答

2

大约一年后,我终于找到了这个问题的答案。这个答案专门针对rails 3.1。我不确定这是否是rails 3.2中的问题。

设置模型时会出现该问题。如果使用脚手架,则不生成帮助文件。这通常位于/app/helpers/staff/location_helper.rb。有两种方法来设置此文件:

module Staff::LocationHelper 
    ... 
end 

module Staff 
    module LocationHelper 
    ... 
    end 
end 

在rails 3.1中,专门用于帮助程序,您必须使用第一个解决方案。您不必将其用于在rails项目的其他部分使用命名空间的其他模块。事实上,红宝石中的某些结构需要第二种解决方案。

如果在声明助手时使用第二种解决方案,在某些情况下,助手文件中的Staff模块将覆盖/app/models/staff.rb中的模块。它会静静地将其替换为文件中空的Staff模块。这不会100%的时间发生,因为助手并不总是被加载。

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回调,因为这似乎是the documented way to execute code before each request only when cache_classes is false。但是,似乎只有在重新启动应用程序后才执行。至少有one other open Stack Overflow question regarding this,尽管他使用的语法稍微不同于我使用的语法。如果你能得到to_prepare的工作,我会建议,而不是before

相关问题