REST on Rails: 扩展MIME类型

还记得前面的那个层叠Select的实现 吗?为了让cities_controller的index方法能够返回一个select tag,我采用了如下的方法:

respond_to do |format|
  format.html { render :partial => params[:partial]}
  format.xml { render :x ml => @districts.to_xml }
end

也就是让客户端发送一个partial参数给index,然后渲染这个partial(值必须为’select’才能正常工作),但是这样存在一个问题,如果用户发送了一个错误的partial参数,可能会导致不确定的结果,并且这种方式也不够RESTful。

比较好的方法是对MIME进行扩展,增加一个select类型,然后我们就可以这样实现index:

respond_to do |format|
  format.select { render :partial => 'select' }
  format.html
  format.xml { render :x ml => @districts.to_xml }
end

要增加一个新的MIME类型,需要在config/environment.rb中增加:

Mime::Type.register "application/select", :select

现在访问/cities.select,可以看到,城市信息被组织成了一个select。

当然,如果想要例子继续正确运行,还需要修改views/people/new.rhtml,让父select发送请求到/cities.select:

<%= f.select (:country_id, Country.find_all.collect {|c| [ c.name, c.id ] },
   { :include_blank => true },
   :o nchange => remote_function(:update => "cities",
     :method => "get",
     :with => "'country_id=' + value",
     :url => '/cities.select'))

参考文档:

This entry was posted in 其它. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

无觅相关文章插件,快速提升流量