如何防止我的routes.rb拦截来自/ blog的请求?

时间:2015-03-12 00:20:47

标签: ruby-on-rails ruby-on-rails-4 routing rack middleman

我的/blog目录只是一堆静态HTML文件。那很好。

当我转到localhost/blog它工作正常时 - 它为我的中间人生成了博客的index.html。大。

但是当我点击任何帖子时,它会给我一个路由错误:

No route matches [GET] "/blog/2015/03/11/hello_world"

我很确定发生这种情况的原因是因为routes.rb中的其中一条规则:

  get '/:friendly_id', to: 'posts#show'
  get '/rbt/:name', to: redirect {|path_params, _| "/#{path_params[:name].gsub(/^\d+\-/, '')}" } 
  get ':name',      to: 'posts#show'

我需要所有这些路由,但我不希望HTML请求不必要地访问我的Rack中间件......或者更糟糕的是,执行此错误似乎表明正在进行的数据库查询。

如何将所有请求限制在/blog/以仅解析到我的public/blog/目录?

修改1

我意识到上面的描述可能不太清楚。我的Rails应用程序不是博客,因此您在上面引用的posts不是博客的帖子。它们是另一种类型的帖子,由Rails应用程序分别由DB和所有人管理。我之后添加了一个真实的/blog,它只是MiddleMan生成的HTML文章的集合,它将位于我的Rails /public/blog文件夹中。想法是我的/blog目录中的HTML文件根本不应该打到我的Rack中间件。

3 个答案:

答案 0 :(得分:4)

您可以通过将config.middleware.use Rack::Static, urls: ['/blog'], root: 'public'添加到config / application.rb来强制机架将某个文件夹作为静态和路由忽略但是最好设置一个Web服务器来拦截和提供/博客比您的应用更早

同样在你的情况下/blog/2015/03/11/hello_world似乎是一个目录名,如果你将index.html添加到它应该按预期工作的链接,而不改变任何配置。

答案 1 :(得分:1)

当您的应用程序由Web服务器运行时,其webroot将成为公共目录。所以,如果你的博客目录在公共目录中,这应该可行。 localhost/blog

尝试使用nginx与以下配置一起运行:

root /root/path/to/your_app/public;

答案 2 :(得分:1)

无法创建static_url控制器并配置路由以便

get '/blog', to: 'static_url#show'

然后在你的控制器中

def show
  render file: request.fullpath
end

抱歉,我现在无法测试,但我相信你明白了。另外,我猜你需要检测不存在的页面。