是否可以配置加载路径以反转Rails中的目录?

时间:2016-01-02 23:05:13

标签: ruby-on-rails ruby-on-rails-4 rails-engines

摘要

我希望构建一个rails monolith Domain Objects@bbozo's suggestion below随着应用的增长而轻松移植。我还想从app/目录开始,而不是从Rails Engine开始,因为对于可能无法忍受的功能而言,引擎似乎需要很多开销,或者该功能可能会转移到HTTP 1}}终点很快。

进度

1。支架

运行rails g scaffold post会在app/中生成以下结构 (除了其他文件

app/
  controllers/
    posts_controller.rb
  models/
    post.rb
  views
    posts/

2。交换目录订单

是否可以配置加载路径以反转目录,以便以下操作;

app/
  post/
    controllers/
      post_controller.rb
     models/
      post.rb
    views/
      index, show, etc...

(我想在Post目录中拥有post/的所有MVC以准备移动post/

  • 下至lib/
  • 到宝石
  • 进入引擎
  • 到我的微服务
  • 或者甚至可能是垃圾,因为它是一个可怕的功能

3。未初始化的常量PostsController

目前,只需反转文件即可提供;

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 )

4。 ::的ActionView MissingTemplate

我遇到的下一个问题是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

5。当前状态

我是否需要为每个端点重新配置 application.rbrender file:

1 个答案:

答案 0 :(得分:1)

解决Rails加载路径

应该工作:

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:P

计划B将放弃app/post/controller的文件夹结构并转到文件夹结构'app / controller / post':)

模型中无需更新加载路径:

  1. 创建文件夹app/models/post
  2. app/models/post.rb中创建空模块,只说module Post; end
  3. 您现在放入'app / models / post'文件夹的每个模型现在可以命名为Post::MyModel并由Rails正确加载
  4. 对于控制器添加命名空间路由,请参阅此答案以获取可能的解决方案Rails Controller Namespace