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

时间:2014-08-21 04:33:09

标签: ruby-on-rails ruby

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

Ruby on Rails有可能吗?

4 个答案:

答案 0 :(得分:6)

正如其他人所提到的,覆盖现有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
)

public文件夹is exposed to the web server through the Rack middleware ActionDispatch::Static。关于它没有什么特别之处,上面的代码只是添加了另一个指向目录client的中间件实例。因此,在上述情况下,浏览器可以访问public以及client中的所有内容。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只需自己为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代替。

答案 3 :(得分:0)

您可以定义另一条路径,例如

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

然后您可以在路线中使用此路径,例如

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