如何在Rails 4中覆盖公用文件夹路径?

我想在名为client的父目录中使用不同的公用文件夹,其中包含整个AngularJS应用程序。 基本上我想告诉Rails加载AngularJS应用程序,Rails唯一要做的就是提供JSON服务。

Ruby on Rails有可能吗?

正如其他人所提到的,覆盖现有paths['public']文件夹可能是也可能不是一个好主意。 但是你可以在像application.rb这样的地方安全地执行以下操作:

 Rails.application.config.middleware.insert_after( ActionDispatch::Static, ActionDispatch::Static, Rails.root.join("client").to_s, Rails.application.config.static_cache_control ) 

公用文件夹通过Rack中间件ActionDispatch::Static公开给Web服务器 。 关于它没有别的特别之处,上面的代码只是添加了另一个指向目录client的中间件实例。 因此,在上述情况下,浏览器将能够访问publicclient

我认为覆盖现有公用文件夹不是一个好主意,因为存在一些依赖性。 通常,rails应用程序在Webrick服务器中运行,但是在生产环境中,如果您希望在Apache Web服务器中运行应用程序,那么您将遇到问题。 因为Apache使用Passenger模块运行Rails应用程序。 Apache只接受/考虑将公用文件夹作为您的Web根目录。 希望你有我的想法。

只需要自己为Angular应用程序做。

把它放在你的application.rb中:

 config.serve_static_files = true paths['public'] = File.join 'client', 'app' 

或者如果您仍然使用资产管道( config.assets.enabled = true ):

 paths['public/javascripts'] = File.join 'client', 'app', 'scripts' paths['public/stylesheets'] = File.join 'client', 'app', 'styles' 

知道第二位是否有任何后果会很有趣,因为我的前端完全分开服务,因此我保持资产管道关闭并使用grunt代替。

您可以定义另一条路径

 # config/application.rb paths['my_website'] = 'website' 

然后你可以在你的路线中使用这条路径

 # routes.rb get '/my_website', to: redirect('my_website/index.html')