Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否可以配置加载路径以反转Rails中的目录?_Ruby On Rails_Ruby On Rails 4_Rails Engines - Fatal编程技术网

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

Ruby on rails 是否可以配置加载路径以反转Rails中的目录?,ruby-on-rails,ruby-on-rails-4,rails-engines,Ruby On Rails,Ruby On Rails 4,Rails Engines,摘要 我想构建一个随着应用程序的发展而易于移植的应用程序。我还想从app/目录开始,而不是从Rails引擎开始,因为引擎对于一个可能无法持久的功能来说似乎是一个很大的开销,或者该功能可能很快就会移动到HTTP端点 进步 1.脚手架 运行rails g scaffold post在app/ (除其他文件外) 2.交换目录顺序 是否可以配置加载路径以反转目录,从而使以下各项正常工作 app/ post/ controllers/ post_controller.rb

摘要

我想构建一个随着应用程序的发展而易于移植的应用程序。我还想从
app/
目录开始,而不是从
Rails引擎开始,因为引擎对于一个可能无法持久的功能来说似乎是一个很大的开销,或者该功能可能很快就会移动到
HTTP
端点

进步

1.脚手架 运行
rails g scaffold post
app/
(除其他文件外)

2.交换目录顺序 是否可以配置加载路径以反转目录,从而使以下各项正常工作

app/
  post/
    controllers/
      post_controller.rb
     models/
      post.rb
    views/
      index, show, etc...
(我想将我所有的
Post
MVC都放在
Post/
目录中,准备移动
Post/

  • 下至
    lib/
  • 至宝
  • 进入引擎
  • 我的微服务
  • 或者甚至是垃圾桶,因为这是一个可怕的功能
3.未初始化的常量PostsController 目前,简单地反转文件可以提供:

application.rb
中的
uninitialized constant PostsController
即使修改了
config.autoload\u路径+=%W(#{config.root}/app/post/*)
。通过显式包含文件而不是像这样使用“*”

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 )
从中,我了解了
文件:
绝对值标志,因此当我添加以下内容时,我进入了
索引:

  def index
    @posts = Post.all
    render file: 'app/post/views/posts/index'
  end
Index
成功呈现,但我必须对这个单一端点进行大量重新配置。我正在尝试确定我是否能够完全管理它,它只适用于
Post#show、Post#edit、Post#create
和其他域对象,如
Likes

5.现状 是否需要为每个端点重新配置
application.rb
render file:

解决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引擎,所以我建议在那个方向进行调查,

在经历了将rails应用程序分解为组件引擎的过程后,我认为您正在尝试做的就是朝着这个方向发展

求解视图查找路径 看,

你也许可以这样做

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
class BasePostsController
知道什么时候进行计划B:P 计划B是放弃使用
app/post/controller
的文件夹结构,转而使用文件夹结构“app/controller/post”:

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

  • 创建文件夹
    app/models/post
  • app/models/post.rb中创建空模块,只说
    module post;结束
  • 您现在放入“app/models/post”文件夹中的每个模型现在都可以命名为
    post::MyModel
    ,并由Rails正确加载

  • 对于添加名称空间路由的控制器,请参阅此答案以获取可能的解决方案

    谢谢@bbozo!这让我解决了控制器问题,我更新了我的问题。但是你认为当我的功能还在
    MVP
    阶段时,在vanillarrails中只使用'app/'目录就可以这样工作吗?如果它能工作的话,我可以把引擎作为下一步,但这对于本季的这项功能来说感觉太多了,很可能它会被猛拉。简而言之,我可以在没有引擎的域对象中思考吗?当然可以:)我的方法是简单地为所有内容命名,然后如果我想破坏或提取该功能,就没有太多的内容需要关注了。至于视图错误,请尝试向rails视图查找路径添加
    posts/views
    :这是一个很好的答案。通过添加动态目录查找,您可以使其更加通用—类似于:config.autoload_paths+=Dir[“#{Rails.root}/app/post/*”]Hmm我无法让
    prepend_view_path
    工作。注意,我在PostController中注释掉了第6行。如果我取消注释,它会起作用。这里有一个截图@wwwoodall,试着使用精确的路径,也许试着使用我的答案中使用class方法的代码,而不是我链接到你的SO问题中的
    before\u filter
    方法。此外,当您的简单且低成本的解决方案变得比您想要避免的更昂贵时,认识到这一点也很好:D但是有一个“更便宜”的方案B,请尽快查看我的更新答案
    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 )
    
    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