Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 我如何防止我的routes.rb拦截到/blog的请求?_Ruby On Rails_Ruby On Rails 4_Routing_Rack_Middleman - Fatal编程技术网

Ruby on rails 我如何防止我的routes.rb拦截到/blog的请求?

Ruby on rails 我如何防止我的routes.rb拦截到/blog的请求?,ruby-on-rails,ruby-on-rails-4,routing,rack,middleman,Ruby On Rails,Ruby On Rails 4,Routing,Rack,Middleman,我的/blog目录只是一堆静态HTML文件。那很好 当我转到localhost/blog时,它工作正常-它为我的中间人生成的blog呈现index.html。太好了 但当我点击任何帖子时,它会给我一个路由错误: No route matches [GET] "/blog/2015/03/11/hello_world" 我很确定发生这种情况的原因是因为我的路线中有一条规则。rb: get '/:friendly_id', to: 'posts#show' get '/rbt/:name'

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

当我转到
localhost/blog
时,它工作正常-它为我的中间人生成的blog呈现index.html。太好了

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

No route matches [GET] "/blog/2015/03/11/hello_world"
我很确定发生这种情况的原因是因为我的
路线中有一条规则。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请求不必要地击中我的机架中间件……或者更糟糕的是,执行此错误似乎表明正在发生的DB查询

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

编辑1


我意识到上面的描述可能不清楚。我的Rails应用程序不是博客,因此上面提到的
帖子
不是博客帖子。它们是另一种帖子,由Rails应用程序使用DB和all分别管理。此后,我添加了一个真正的
/blog
,它将只是由生成的HTML文章的集合,这些文章将放在我的Rails
/public/blog
文件夹中。我的想法是,我的
/blog
目录中的HTML文件根本不应该击中我的机架中间件。

当你的应用程序由webserver运行时,它的webroot将是公共目录。所以,如果你有你的博客目录在公共目录内,这应该是可行的<代码>本地主机/博客

尝试使用以下配置运行
nginx

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

您可以通过向config/application.rb添加
config.middleware.use rack::static,URL:['/blog'],root:'public'
,强制rack将某些文件夹作为静态文件夹提供服务,并忽略路由,但我认为最好在您的应用程序之前设置一个web服务器来拦截和提供/blog


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

您不能创建一个
静态url
控制器并配置您的路由以便

get '/blog', to: 'static_url#show'
然后在你的控制器中

def show
  render file: request.fullpath
end

对不起,我现在不能测试,但我相信你明白了。另外,我想你需要检测不存在的页面。

你能提供你的帖子url吗?@Arv哪个帖子url?不知道你的意思。你在哪个帖子上点击,这会给你一个错误。我不会点击任何帖子。我的网站有帖子,这与我试图设置的博客是分开的。文章不是博客的子对象。这是两件不同的事情。post是由Rails管理的资源。我新的
博客
位于
/blog
是一组由Middleman(类似于Octopress)编译的静态生成的HTML页面。请尝试使用类似
.HTML
的扩展名。因为你似乎只是在生成html文件并将其放入公用文件夹,不是吗?是的,我同意。它应该会起作用。但事实并非如此,因为我在上面的问题中指定了路由规则。好的,首先,为什么要在根级别定义路由提取参数?我想你也会遇到问题,比如
get'/:friendly\u id',to:'posts#show'
get:name',to:'posts#show'
。我不认为你能够绕过机架中间件,最好在某些资源名称下定义这些路由。e、 g.
get'/posts/:friendly_id',to:'posts#show'
,这不仅仅是因为你没有其他选择。但这条路线将更具描述性,并正确地表示资源。我认为更干净的方法。
Rack::Static
的建议非常有趣。它可以工作是的,但正如你所说的……最好让服务器来做,而不是机架中间件。使用
index.html
不起作用,因为请求永远不会到达我的
public
文件夹。它只是被重定向到我的路由器。我知道,因为我试过了。是的,这可能行得通,但这里的问题是,它需要所有HTML请求不必要地命中我的机架中间件。如果可以的话,我正试图完全避免这种情况。