respond_to 新构想
respond_to 非常好用,可以根据不同的 format 来选择不同的应答策略,并且自动设置相应的 MIME 值,看上去也非常爽目。
在 Blog 系统中,比如文章的 RSS,就可以:
-
def index
-
@posts = Post.find(:all)
-
respond_to do |format|
-
format.html { ...}
-
format.rss {...}
-
end
-
end
这样比在单独构建一个 RSS action 要好得多~
不过,如果 Blog 通过 html 显示出来的话,还需要做其他一些事情,比如构建 Blog 的各个边栏,这些事情一般都放在 before_filter 中去做:
-
class PostsController < ApplicationController
-
before_filter :get_sidebars
-
...
但是这些工作在 RSS 中完全不需要,那么怎么在 RSS 忽略掉这些工作呢?
一个选择就是去掉 before_filter,把 get_sidebars 写入到 format.html { } 中去,这样的话,PostsController 里面每个 action 的 format.html 都要这样做,不是啥好办法。
第二个选择就是在 get_sidebars 里面检测 format:
-
def get_sidebars
-
if params[:format] == "html"
-
...create sidebars
这样似乎还算 ok,其他的方法还没有想出来……
前两天,正好看到 maiha 写的新 respond_to 表示方法的构想,去掉 respond_to 那个 block,而按照 aciton.format 的格式,把不同 format 的处理,放到单独的函数中去:
-
def index
-
@posts = Post.find(:all)
-
end
-
-
def index.html
-
...
-
end
-
-
def index.rss
-
...
-
end
这样看上去比 respond_to 清晰了很多,如果可以实现,那么如果在 before_filter 里面也可以:
-
before_filter :get_sidebars, :only => "*.html"
就能完美的解决上面的问题了~