Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

respond_to 新构想

respond_to 非常好用,可以根据不同的 format 来选择不同的应答策略,并且自动设置相应的 MIME 值,看上去也非常爽目。

在 Blog 系统中,比如文章的 RSS,就可以:

  1. def index
  2.    @posts = Post.find(:all)
  3.    respond_to do |format|
  4.        format.html { ...}
  5.        format.rss {...}
  6.    end
  7. end

这样比在单独构建一个 RSS action 要好得多~

不过,如果 Blog 通过 html 显示出来的话,还需要做其他一些事情,比如构建 Blog 的各个边栏,这些事情一般都放在 before_filter 中去做:

  1. class PostsController < ApplicationController
  2.     before_filter :get_sidebars
  3.     ...

但是这些工作在 RSS 中完全不需要,那么怎么在 RSS 忽略掉这些工作呢?

一个选择就是去掉 before_filter,把 get_sidebars 写入到 format.html { } 中去,这样的话,PostsController 里面每个 action 的 format.html 都要这样做,不是啥好办法。

第二个选择就是在 get_sidebars 里面检测 format:

  1. def get_sidebars
  2.     if params[:format] == "html"
  3.        ...create sidebars

这样似乎还算 ok,其他的方法还没有想出来……

前两天,正好看到 maiha 写的新 respond_to 表示方法的构想,去掉 respond_to 那个 block,而按照 aciton.format 的格式,把不同 format 的处理,放到单独的函数中去:

  1. def index
  2.     @posts = Post.find(:all)
  3. end
  4.  
  5. def index.html
  6.     ...
  7. end
  8.  
  9. def index.rss
  10.    ...
  11. end

这样看上去比 respond_to 清晰了很多,如果可以实现,那么如果在 before_filter 里面也可以:

  1. before_filter :get_sidebars, :only => "*.html"

就能完美的解决上面的问题了~