Построение динамических полей с использованием ActiveRecord :: Serialization.to_xml - PullRequest
3 голосов
/ 04 ноября 2008

Мне любопытно, что люди используют AR to_xml () для создания полей, не являющихся объектами (например, не атрибута модели, которую вы сериализуете, а, возможно, использование атрибутов в процессе) из контроллера.

to_xml предлагает несколько вариантов для этого.

Одним из них является передача ссылок на методы объекта, на который воздействуют: в процессе сериализации эти методы вызываются и их результаты добавляются в сгенерированный документ. Я бы хотел избежать этого пути, потому что некоторые из сгенерированных данных, в зависимости от атрибутов объекта, могут выходить за рамки самой модели - например, создание URL-адреса для определенного элемента «show» action. Плюс, это требует слишком много продуманного. Я хотел бы просто иметь возможность изменить результирующий документ путем настройки кода to_xml из контроллера. Я не хочу хлопот необходимости объявлять метод в объекте также.

То же самое касается переопределения to_xml в каждом объекте.

Другие два варианта, похоже, лучше соответствуют требованиям: один из них заключается в передаче процедур в параметрах сериализации, которые генерируют эти поля, а другой - в передаче блока, который будет уступать после сериализации атрибутов объектов. Они предоставляют тот вид настройки в момент вызова, который я ищу, и, кроме того, их объявления связывают область действия с контроллером, так что они имеют доступ к тому же материалу, что и контроллер, но они методы кажутся критически ограниченными: AFAICT они не содержат ссылки на сериализуемый объект. Они содержат ссылки на объект компоновщика, который, я думаю, вы могли бы проанализировать в блоке / proc и найти атрибуты, которые уже были сериализованы, и использовать их, но это харанг, или, по крайней мере, нелегкий и неоптимальный.

Поправьте меня, если я ошибаюсь, но какой смысл иметь доступ к прокам / блокам при сериализации одного или нескольких объектов, если вам нужен доступ к самому объекту.

В любом случае, пожалуйста, скажите мне, как я ошибаюсь, потому что, похоже, я здесь что-то упускаю.

Да, да, я знаю, что могу написать свою собственную точку зрения. Я пытаюсь использовать response_to и to_xml для достижения минимального количества дополнительных файлов / строк. (Впрочем, именно к этому я и прибегал, когда не мог понять, как это сделать с помощью сериализации AR.)

** РЕДАКТИРОВАТЬ 3.29.09 - Я только что отправил патч для этого в Rails. Если вам интересно, покажите поддержку :) https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2373-record-sensitive-procs-for-to_xml

Ответы [ 2 ]

1 голос
/ 23 июля 2009

Woo! Мой патч для обработки этого сценария был принят: http://github.com/rails/rails/commit/c39151a84768397d3bb025c6e8f877eac59ebbf9 Теперь это часть ActiveModel, и я не совсем уверен, каков график выпуска для этого; Я думаю, Rails 3.

1 голос
/ 04 ноября 2008

На самом деле Proc передается с таким же хешем параметров (за исключением параметра procs), который вы передали в to_xml. Таким образом, вы можете передать любые дополнительные объекты, необходимые Proc для выполнения своей работы:

proc = Proc.new {|options| options[:builder].tag!('reverse-name', options[:object].name.reverse)}
object.to_xml :object => object, :procs => [ proc ]

Поскольку вы получаете, что процесс получает те же опции, что и to_xml, это позволяет вам передавать любые нужные вам опции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...