了解知识
在《Ruby on Rails,目录结构一瞥》中我们提及过public目录和app目录的作用是不同的。有必要通过例子更加清楚的知道他们之间的差别,顺便了解一下在Rails中web服务器是如何响应页面提交过来的请求的。
图中展示了Rails框架在web应用中所处的位置,其中名为public的文件夹就是Rails目录中的那个同名文件夹。
 
来自浏览器的请求抵达web服务器后,web服务器会拿着这个请求地址在public目录中查找看看有没有资源的路径和名称能够和请求完全吻合。如果能够成功找到这样的资源,web服务器会直接将这个资源返回给浏览器,并不会与Rails框架发生交互。这种交互方式适用于返回诸如图片等静态内容的情况,请求不需要经过特别的计算和处理便直接做出响应。
如果请求在public目录中没有能够找到完全匹配的资源又会怎么样呢?这个请求该被发往Rails框架了,接收这个请求的是叫做Routing的模块。Routing负责尝试解析这个请求所应该对应的Controller和Action并调用之后生成将要返回给浏览器的页面。
这里有两点需要说明,首先无论是从public目录中返回的页面还是经过Rails框架生成的动态内容页面都是HTML页面文件,因为这是浏览器唯一能够识别的文件格式。其次是public目录的位置是在web服务器与Rails框架之间,有些时候这个目录中的内容是有可能影响请求响应结果的。
关于第二点做个小实验来说明一下。启动服务器,在浏览器中输入:http://localhost:3000/404.html 会显示“页面没有找到”的提示。但其实这不是真的页面没有找到,而是我们正在访问提示“页面没有找到”的页面本身!
 
原因是对于页面请求“http://localhost:3000/”,后面什么都不加的话即是指向public目录。在我的public目录中正好有个名为404.html的文件。请求的地址正好和我public目录中的资源匹配上了自然直接返回并显示在浏览器上。
 
还记得我们在《Ruby on Rails,创建最简单的视图/控制器单元Hello World》中创建的视图/控制器小例子吗?通过访问localhost:3000/demo/index地址,Rails调用了demo控制器的index方法返回了index.html.erb对应的view。但如果我们在public目录中创建一个名为demo的目录,下面放一个叫做index.html的文件,相同的页面请求将会返回什么样的结果呢?
 
 
<!DOCTYPE html>  
<html>  
<body>  
  <div class="dialog">  
    <h1>这是public目录中的demo/index.html文件</h1>  
  </div>  
</body>  
</html>  
 
没错,localhost:3000/demo/index的请求没有经过Rails的处理而是直接返回了public目录中直接匹配的静态页面文件。
 
 
这就是为什么在public目录中的缺省index页面中,提示我们要将这个目录中的index文件移除掉的原因啦!
 
标签: Rails
扩展知识