После прочтения книги Леонард Ричардсона и Сэма Руби «RESTful Web Services» мне кажется, что метод рельсов to_xml не так расслаблен, как должен быть. В частности, в книге представлена ресурсно-ориентированная архитектура, одним из принципов которой является связность: представления ресурса должны содержать не только данные ресурса, но и ссылки на другие ресурсы.
Однако, когда rails строит ресурс, он реализует запросы на представление в формате XML, передавая значение [model] #to_xml. Этот метод не имеет доступа к обычным помощникам пути, поэтому любые ссылки на другие ресурсы указываются только их идентификаторами, а не их URI.
Я уже решил эту проблему, но решение кажется не очень надежным: учитывая ресурс Employer с вложенными сотрудниками, следующий код (вроде) добавляет Uris к их сериализации xml:
class Employee < ActiveRecord::Base
include ActionController::UrlWriter
belongs_to :employer
def to_xml(options = {})
options[:procs] = [ Proc.new {|options| options[:builder].tag!('uri', employer_employee_path(employer, self)) } ]
if options[:depth].nil?
options[:depth] = 1
end
if options[:depth] != 0
options[:depth] -= 1;
options[:include] = [:employer]
end
super(options)
end
end
class Employer < ActiveRecord::Base
include ActionController::UrlWriter
has_many :employees
def to_xml(options = {})
options[:procs] = [ Proc.new {|options| options[:builder].tag!('uri', employer_path(self)) } ]
if options[:depth].nil?
options[:depth] = 1
end
if options[:depth] != 0
options[:depth] -= 1;
options[:include] = [:employees]
end
super(options)
end
end
UrlWriter позволяет мне правильно создать путь к ресурсу (но не к полному URI. Домен должен быть вставлен на путь клиентами моего веб-сервиса). Теперь модели отвечают за свой URI и за включение представления любого подключенного ресурса. Я использую опцию: глубина, чтобы избежать бесконечного повторения.
Этот метод работает, но, как уже говорилось ранее, он не совсем верный, со всем дублированием. У кого-нибудь еще была такая же проблема, и есть ли у кого-то еще лучшее представление о том, как получить uris в представлении xml?