摘要
我希望构建一个rails monolith Domain Objects,@bbozo's suggestion below随着应用的增长而轻松移植。我还想从app/
目录开始,而不是从Rails Engine
开始,因为对于可能无法忍受的功能而言,引擎似乎需要很多开销,或者该功能可能会转移到HTTP
1}}终点很快。
进度
运行rails g scaffold post
会在app/
中生成以下结构
(除了其他文件)
app/
controllers/
posts_controller.rb
models/
post.rb
views
posts/
是否可以配置加载路径以反转目录,以便以下操作;
app/
post/
controllers/
post_controller.rb
models/
post.rb
views/
index, show, etc...
(我想在Post
目录中拥有post/
的所有MVC以准备移动post/
:
lib/
目前,只需反转文件即可提供;
uninitialized constant PostsController
即使修补了config.autoload_paths += %W( #{config.root}/app/post/* )
中application.rb
的变体。 rails guides通过明确包含文件而不是像这样使用'*'来工作;
class Application < Rails::Application
config.autoload_paths += %W( #{config.root}/app/ )
config.autoload_paths += %W( #{config.root}/app/post/controllers )
config.autoload_paths += %W( #{config.root}/app/post/models )
我遇到的下一个问题是ActionView::MissingTemplate
ActionView::MissingTemplate (Missing template posts/index, application/index with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
* "/app/views"
):
.bundle/gems/actionview-4.2.0/lib/action_view/path_set.rb:46:in `find'
.bundle/gems/actionview-4.2.0/lib/action_view/lookup_context.rb:121:in `find'
.bundle/gems/actionview-4.2.0/lib/action_view/renderer/abstract_renderer.rb:18:in `find_template'
.bundle/gems/actionview-4.2.0/lib/action_view/renderer/template_renderer.rb:40:in `determine_template'
.bundle/gems/actionview-4.2.0/lib/action_view/renderer/template_renderer.rb:8:in `render'
.bundle/gems/actionview-4.2.0/lib/action_view/renderer/renderer.rb:42:in `render_template'
.bundle/gems/actionview-4.2.0/lib/action_view/renderer/renderer.rb:23:in `render'
.bundle/gems/actionview-4.2.0/lib/action_view/rendering.rb:100:in `_render_template'
.bundle/gems/actionpack-4.2.0/lib/action_controller/metal/streaming.rb:217:in `_render_temp
[cut out the rest]
从{{3}}我读到关于绝对值的file:
标志,所以当我添加以下内容时,我到了Index
:
def index
@posts = Post.all
render file: 'app/post/views/posts/index'
end
Index
已成功呈现,但我必须为此单个端点执行大量重新配置。我正在尝试确定我是否可以在胆量中管理它,它只适用于Post#show, Post#edit, Post#create
和其他域对象,例如Likes
我是否需要为每个端点重新配置 application.rb
和render file:
?
答案 0 :(得分:1)
此 应该
config.autoload_paths += %W( #{config.root}/app/post/models )
config.autoload_paths += %W( #{config.root}/app/post/controllers )
config.autoload_paths += %W( #{config.root}/app/post/views )
但是考虑一下,也许你正试图重新实现一个Rails引擎,所以我建议你调查这个方向,
https://blog.pivotal.io/labs/labs/migrating-from-a-single-rails-app-to-a-suite-of-rails-engines
在将rails应用程序分解为组件引擎的一些经验之后,在我想要做的事情中,我认为这就是我要采取的方向
请参阅How can I add a view path to Rails's partial rendering lookup?,
你可能会做这样的事情
class BasePostsController < ApplicationController
# I assume you have a base controller for Post from which other
# post controllers inherit from, this would be a good fit
prepend_view_path 'app/post/views'
end
计划B将放弃app/post/controller
的文件夹结构并转到文件夹结构'app / controller / post':)
模型中无需更新加载路径:
app/models/post
app/models/post.rb
中创建空模块,只说module Post; end
Post::MyModel
并由Rails正确加载对于控制器添加命名空间路由,请参阅此答案以获取可能的解决方案Rails Controller Namespace