Зацените, кто еще не видел, насколько меньше кода стало в контроллерах Rails 3! Теперь можно сказать, что контроллеры стали по-настоящему соответствующими принципу DRY. И всё это благодаря респондерам. В общем, мне нравится:
class ProductsController < ApplicationController
respond_to :html, :xml
def index
respond_with(@products = Product.all)
end
def show
respond_with(@product = Product.find(params[:id]))
end
def new
respond_with(@product = Product.new)
end
def create
@product = Product.new(params[:product])
flash[:notice] = "Successfully created product." if @product.save
respond_with(@product)
end
def edit
respond_with(@product = Product.find(params[:id]))
end
def update
@product = Product.find(params[:id])
flash[:notice] = "Successfully updated product."
if @product.update_attributes(params[:product])
respond_with(@product)
end
def destroy
@product = Product.find(params[:id])
@product.destroy
flash[:notice] = "Successfully destroyed product."
respond_with(@product)
end
end
В респондерах теперь содержится вся та магия по отдаче ответа клиенту, которая раньше находилась в контроллере, в блоке, передаваемому методу respond_to. Сейчас стало удобно контролировать отдачу типов контента - ну нужно править каждый метод контроллера, если вы захотите добавить или убрать тип контента. Кстати, метод respond_to поддерживает ключи :only и :except, чтобы контролировать типы контента для методов.
Самое главное - это все работает, и работает замечательно! Я сейчас пишу проект на Rails 3 и использую всю эту красоту. В общем - радости нет предела)
Рекомендую почитать вот эту статейку на английском: Controllers in Rails 3
Also interesting
Tags: rails, rails 3, ruby, Ruby on Rails
Респондеры были еще в rails2