我在一个 Rails 项目中工作,在该项目中我使用以下名称作为模型/控制器和类文件
/app/models/friends/friend.rb
/app/controllers/friends/friends_controller.rb
/lib/classes/friends/friend.rb
我尝试在 application.rb 的自动加载路径中添加所有模型、控制器和类文件。但我面临问题,因为类名相同。
我该如何处理?并以使用名称空间组织文件的方式组织文件。
谢谢,巴兰
我在一个 Rails 项目中工作,在该项目中我使用以下名称作为模型/控制器和类文件
/app/models/friends/friend.rb
/app/controllers/friends/friends_controller.rb
/lib/classes/friends/friend.rb
我尝试在 application.rb 的自动加载路径中添加所有模型、控制器和类文件。但我面临问题,因为类名相同。
我该如何处理?并以使用名称空间组织文件的方式组织文件。
谢谢,巴兰
更好的方法是使用Rails 引擎并将您的应用程序划分为独立的模块。
rails plugin new friends --full --mountable --dummy-path spec/dummy
上述命令将生成一个具有隔离命名空间的完全可挂载引擎,这意味着来自该引擎的所有控制器和模型都将在引擎的命名空间内隔离。例如,Post
稍后将调用模型Friends::Post
,而不是简单地调用Post
。要将这个应用程序安装在你的主 Rails 应用程序中,你需要做两件事:
向 Gemfile 添加条目
gem 'friends', path: "/path/to/friends/engine"
然后将路由添加到 config/routes.rb
mount Friends::Engine, at: "/friends"
有关此方法的更多信息,请查看:
The class names are same but path's are different, and you don't need to add classes to autoload except /lib/classes/friends/friend.rb
Did you tried the following way:
# app/models/friends/friend.rb
class Friends::Friends
#...
end
# Friends::Friends.new
# app/controllers/friends/friends_controller.rb
class Friends::FriendsController < ApplicationController
#...
end
# lib/classes/friends/friend.rb
module Classes
module Friends
class Friends
#...
end
end
end
# Classes::Friends::Friends.new
To add lib files to autoload add following to your applicaion.rb
config.autoload_paths += %W(#{config.root}/lib)