ruby-on-rails – 子文件夹和关系中的Rails模型

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 子文件夹和关系中的Rails模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我自动加载的文件夹中组织了一些我的rails模型
  1. config.autoload_paths += Dir[Rails.root.join('app','models','{**}')]

我可以直接使用所有模型(例如Image.first.file_name),但是当我尝试通过关系访问它们时,例如@ housing.images.each do … with has_many:images我收到以下错误

  1. Unable to autoload constant Housing::HousingImage,expected /path/app/models/housing/image.rb to define it

如何让rails使用我的模型进行关系方法

我正在运行ruby 2.2和rails 4.2

解决方法

Rails自动从子文件夹加载模型,但确实希望它们具有命名空间.
  1. /app/models/user.rb
  2. class User
  3. end
  4.  
  5. /app/models/something/user.rb
  6. class Something::User
  7. end

如果你没有在子文件夹中正确地命名模型,它将搞乱Rails自动加载器并导致你看到的错误.

删除

  1. config.autoload_paths += Dir[Rails.root.join('app','{**}')]

并为您的模型添加适当的命名空间,一切都会正常工作.

您可以在关系中轻松使用命名空间模型,如下所示:

  1. class User
  2. has_many :photos,class_name: 'Something::Photo'
  3. end
  4.  
  5. user.photos (will be instances of Something::Photo)

如果您不想使用命名空间但由于其他原因而拆分模型,则可以在顶层执行此操作并使用模型旁边的其他文件夹.
默认情况下,rails会加载应用程序中的所有文件夹,因此您可以在“模型”旁边创建一个文件夹“models2”或任何您想要调用文件夹.
这对rails类加载的功能没有任何影响.

根据您的示例,您可以这样做:

  1. /app
  2. /controllers
  3. /models
  4. for all your normal models
  5. /housing
  6. for your "housing" models

像这样你可以直接在顶级命名空间访问它们,没有class_name设置或任何需要的东西.

猜你在找的Ruby相关文章