Ответ 1
Возможно, вы можете использовать json.merge!
.
json.merge! notification.attributes
https://github.com/rails/jbuilder/blob/master/lib/jbuilder.rb#L277
Мне больно писать такие коды, как это все время в шаблоне jbuilder.json:
json.extract! notification, :id, :user_id, :notice_type, :message, :resource_type, :resource_id, :unread, :created_at, :updated_at
Поэтому я хотел бы написать код следующим образом:
json.extract_all! notification
Я нашел, что могу сделать это как следующие коды, но они все еще немного длинны для меня.
notification.attributes.each do |key, value|
json.set!(key, value)
end
Есть ли лучший способ?
Возможно, вы можете использовать json.merge!
.
json.merge! notification.attributes
https://github.com/rails/jbuilder/blob/master/lib/jbuilder.rb#L277
Я использую jbuilder 1.5.0 и сливаюсь! не работает, но я нашел альтернативный синтаксис:
json.(notification, *notification.attributes.keys)
Добавление большего количества ответов @uiureo
Предположим, что в вашем уведомлении есть некоторые типы загрузчиков изображений (например, wavewave, paperclip)
Затем ниже версия не вернет вам объект uploader, так как вы можете получить URL-адрес изображения?
json.merge! notification.attributes
notification.attributes
представляет собой хеш-преобразование объекта, оно возвращает значение столбца загруженного сервера, но не URL-адрес.
notification: Object {
title: "hellow world"
img: "sample.png"
}
Вместо этого попробуйте
json.merge! notification.as_json
Это вернет установленный столбец в качестве другого объекта, в который вы можете запросить URL-адрес.
notification: Object {
title: "hellow world"
img: Object {
url: "https://www.example.com/sample.png"
}
}
Вы можете посмотреть json.except!
json.except! @resource, :id, :updated_at
json.except! @resource
В случае, если вы хотите исключить любой из атрибутов. Пример: created_at
и updated_at
json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }
Вот как я это делаю
json.property do
Property.column_names.each do |name|
json.set! name, @property.try(name)
end
# has_ones:
json.contact @property.contact
end
Легко увидеть, что происходит, добавить логику, чтобы пропустить поля и т.д., делая это таким образом.