jazmfg  
jazmfg
-

          假设有一个控制器名为a,其中定义了一个名为b的action.显然如果在浏览器中键入.../a/b,则会直渲染views中的b.rhtml.

          现希望通过某种方法(此处以键入.../a/b/xml为例)来获得xml文件内容,该如何办呢?

          首先在views中新建一个b.rxml文件.

          接着在a_controller中的b action中加入如下代码:

1respond_to do |format| do
2format.html
3format.xml
4end 
5

                                                           

          最后,我们需要在.../config/routes.rb中加入:

1map.connect ':controller/:action/:format' 

          使得.../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中   若

 

1map.connect ':controller/:action/:format'

语句前有一句

1map.connect ':controller/:action/:id'

则若输入.../a/b/xml会使得 :id => xml,造成错误.此时需要将 :id正则,使其仅能代表数字,当接受的内容不是数字时便尝试匹配

1map.connect ':controller/:action/:format'

 

于是可将

1map.connect ':controller/:action/:id'

改为

1map.connect ':controller/:action/:id',:id=>/\d+/

即可

   3.解决了上述两个问题,我们急切的想在浏览器中键入..../a/b/xml尝试一下,事实表明我们前面的作为是完全正确的,xml文件被很好的显示出来.

        但是,如果键入.../a或者.../a/b这样的网址,会显示错误.这是为什么呢?为什么原来不会出错呢?

       原因就在于:

1map.connect ':controller/:action/:id'

被改为了

1map.connect ':controller/:action/:id',:id=>/\d+/

   原先如果输入.../a或者.../a/b时,由于没有对:id做限定,所以:id可以为空.

   但是现在由于将:id 正则限定为数字,则在没有:id的前提下无法在routes.rb中找到相应的默认路径,于是便出现了错误.

   解决的方法是:我们在routes.rb的最后加入一行

1map.connect ':controller/:action'

这就是所谓的"最终默认路径方法",当之前的所有路径方法都无法匹配时,便来匹配这个方法.

这样,基本上便解决了需要获取xml 以及一些相关的问题.

               

posted on 2009-02-23 23:35  jazmfg  阅读(681)  评论(0编辑  收藏  举报