假设有一个控制器名为a,其中定义了一个名为b的action.显然如果在浏览器中键入.../a/b,则会直渲染views中的b.rhtml.
现希望通过某种方法(此处以键入.../a/b/xml为例)来获得xml文件内容,该如何办呢?
首先在views中新建一个b.rxml文件.
接着在a_controller中的b action中加入如下代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
最后,我们需要在.../config/routes.rb中加入:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
使得.../a/b/xml可以生效
通过以上三步,照理说应该是可以在需要xml时获得相应的文件信息,但是我在这个过程中碰到了一些问题:
1.在a_controller中有layout或者.../app/views/layout中存在a.rhtml的渲染文件.在这种情况下,显示xml 时会加入渲染,导致xml文件不能正常显示.
此时,我们需将format.xml修改为format.xml{:action => "b.xml", :layout => false}这样,就在显示b.xml时不加载.../app/views/layout/a.rhtml,以达到正常显示b.xml的目的
2.在.../config/routes.rb中 若
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
语句前有一句
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
则若输入.../a/b/xml会使得 :id => xml,造成错误.此时需要将 :id正则,使其仅能代表数字,当接受的内容不是数字时便尝试匹配
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
于是可将
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
改为
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
即可
3.解决了上述两个问题,我们急切的想在浏览器中键入..../a/b/xml尝试一下,事实表明我们前面的作为是完全正确的,xml文件被很好的显示出来.
但是,如果键入.../a或者.../a/b这样的网址,会显示错误.这是为什么呢?为什么原来不会出错呢?
原因就在于:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
被改为了
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
原先如果输入.../a或者.../a/b时,由于没有对:id做限定,所以:id可以为空.
但是现在由于将:id 正则限定为数字,则在没有:id的前提下无法在routes.rb中找到相应的默认路径,于是便出现了错误.
解决的方法是:我们在routes.rb的最后加入一行
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这就是所谓的"最终默认路径方法",当之前的所有路径方法都无法匹配时,便来匹配这个方法.
这样,基本上便解决了需要获取xml 以及一些相关的问题.