从 Rails 为 Ember 格式化 JSON
Formatting JSON from Rails for Ember
目前,我的 rails API 和 ember 前端应用程序中的 JSON 对于我的图像模型格式不正确,如下所示。
这导致 ember Chrome 工具将我的 Project_image 的数据显示为 'object Object',将 project_id 的数据显示为 'null',这是在我的模板中非常有用。
如何使用 Active_Model_Serializer 格式化 JSON 以正确输出数据。
当前 JSON 示例:
{
"images":
[
{
"id":6,
"project_image":
{"project_image":
{"url":"/uploads/image/project_image/6/example_image.jpg"}
},
"project_id":8
}
]
}
当前image_serializer.rb
class ImageSerializer < ActiveModel::Serializer
attributes :id, :project_image, :project_id
end
如有任何帮助,我们将不胜感激! :)
Ember 型号
图片
App.Image = DS.Model.extend({
project_image: DS.attr('string'),
project_id: DS.attr('number'),
project: DS.belongsTo('project')
});
项目
App.Project = DS.Model.extend({
client: DS.attr('string'),
tags: DS.attr('string'),
description: DS.attr('string'),
start_date: DS.attr('string'),
end_date: DS.attr('string'),
images: DS.hasMany('image')
});
Rails 型号
图片
class Image < ActiveRecord::Base
belongs_to :project
mount_uploader :project_image, ImageUploader
end
项目
class Project < ActiveRecord::Base
has_many :images, :dependent => :destroy
accepts_nested_attributes_for :images, allow_destroy: true
end
所有项目模型数据加载正确,错误仅出现在图像模型上。
更新:
我认为这样可以解决问题:
class ImageSerializer < ActiveModel::Serializer
attributes :id, :project_image_url, :project_id
def project_image_url
project.image_url
end
end
关键是将 url 作为字符串发送过来。你也可以玩这个名字,只要确保名字在 Ember 模型中匹配。
您使用的 active_model_serializers 是什么版本?我有类似的问题。 0.8.x 根据 the Readme.
为我修复了它
对于任何对解决方案感兴趣的人,我使用了 DavidKovsky 创建自定义方法的想法来确保 JSON 数据以正确的格式传递。
序列化器文件:
#app/serializers/image_serializer.rb
class ImageSerializer < ActiveModel::Serializer
attributes :id, :_project_image, :_project_id
def _project_image
object.project_image.to_s
end
def _project_id
object.project_id.to_i
end
end
#app/serializers/project_serializer.rb
class ProjectSerializer < ActiveModel::Serializer
attributes :id, :client, :tags, :description, :start_date, :end_date
has_many :images, embed: :ids, include: true
end
Ember 型号:
#app/assets/javascripts/models/image.js
App.Image = DS.Model.extend({
_project_image: DS.attr('string'),
_project_id: DS.attr('number'),
project: DS.belongsTo('project')
});
#app/assets/javascripts/models/project.js
App.Project = DS.Model.extend({
client: DS.attr('string'),
tags: DS.attr('string'),
description: DS.attr('string'),
start_date: DS.attr('string'),
end_date: DS.attr('string'),
images: DS.hasMany('image')
});
Ember商店
#app/assets/javascripts/store.js
DS.RESTAdapter.reopen({
namespace: 'api/v1'
})
App.Store = DS.Store.extend({});
App.ApplicationAdapter = DS.ActiveModelAdapter.extend({});
Ember 模板中的用法(使用标志 - emblemjs.com)
#app/assets/javascripts/templates/project.js.emblem
each image in model.images
img src=image._project_image
在 Ember 模板中使用车把(如果您不使用标志)
#app/assets/javascripts/templates/project.js.hbs
{{ #each image in model.images }}
img src="{{ image._project_image }}"
{{ /each }}
在我的 gemfile 中,我使用 rails '4.2.0.beta4' 和 active_model_serializers '0.8.3'
我可以看出,如果您有很多属性要转换为字符串、整数等,这种解决方法可能会变得很麻烦,但它至少在短期内有效。
希望这对某人有所帮助,再次感谢 DavidKovsky 的帮助。
目前,我的 rails API 和 ember 前端应用程序中的 JSON 对于我的图像模型格式不正确,如下所示。
这导致 ember Chrome 工具将我的 Project_image 的数据显示为 'object Object',将 project_id 的数据显示为 'null',这是在我的模板中非常有用。
如何使用 Active_Model_Serializer 格式化 JSON 以正确输出数据。
当前 JSON 示例:
{
"images":
[
{
"id":6,
"project_image":
{"project_image":
{"url":"/uploads/image/project_image/6/example_image.jpg"}
},
"project_id":8
}
]
}
当前image_serializer.rb
class ImageSerializer < ActiveModel::Serializer
attributes :id, :project_image, :project_id
end
如有任何帮助,我们将不胜感激! :)
Ember 型号
图片
App.Image = DS.Model.extend({
project_image: DS.attr('string'),
project_id: DS.attr('number'),
project: DS.belongsTo('project')
});
项目
App.Project = DS.Model.extend({
client: DS.attr('string'),
tags: DS.attr('string'),
description: DS.attr('string'),
start_date: DS.attr('string'),
end_date: DS.attr('string'),
images: DS.hasMany('image')
});
Rails 型号
图片
class Image < ActiveRecord::Base
belongs_to :project
mount_uploader :project_image, ImageUploader
end
项目
class Project < ActiveRecord::Base
has_many :images, :dependent => :destroy
accepts_nested_attributes_for :images, allow_destroy: true
end
所有项目模型数据加载正确,错误仅出现在图像模型上。
更新: 我认为这样可以解决问题:
class ImageSerializer < ActiveModel::Serializer
attributes :id, :project_image_url, :project_id
def project_image_url
project.image_url
end
end
关键是将 url 作为字符串发送过来。你也可以玩这个名字,只要确保名字在 Ember 模型中匹配。
您使用的 active_model_serializers 是什么版本?我有类似的问题。 0.8.x 根据 the Readme.
为我修复了它对于任何对解决方案感兴趣的人,我使用了 DavidKovsky 创建自定义方法的想法来确保 JSON 数据以正确的格式传递。
序列化器文件:
#app/serializers/image_serializer.rb
class ImageSerializer < ActiveModel::Serializer
attributes :id, :_project_image, :_project_id
def _project_image
object.project_image.to_s
end
def _project_id
object.project_id.to_i
end
end
#app/serializers/project_serializer.rb
class ProjectSerializer < ActiveModel::Serializer
attributes :id, :client, :tags, :description, :start_date, :end_date
has_many :images, embed: :ids, include: true
end
Ember 型号:
#app/assets/javascripts/models/image.js
App.Image = DS.Model.extend({
_project_image: DS.attr('string'),
_project_id: DS.attr('number'),
project: DS.belongsTo('project')
});
#app/assets/javascripts/models/project.js
App.Project = DS.Model.extend({
client: DS.attr('string'),
tags: DS.attr('string'),
description: DS.attr('string'),
start_date: DS.attr('string'),
end_date: DS.attr('string'),
images: DS.hasMany('image')
});
Ember商店
#app/assets/javascripts/store.js
DS.RESTAdapter.reopen({
namespace: 'api/v1'
})
App.Store = DS.Store.extend({});
App.ApplicationAdapter = DS.ActiveModelAdapter.extend({});
Ember 模板中的用法(使用标志 - emblemjs.com)
#app/assets/javascripts/templates/project.js.emblem
each image in model.images
img src=image._project_image
在 Ember 模板中使用车把(如果您不使用标志)
#app/assets/javascripts/templates/project.js.hbs
{{ #each image in model.images }}
img src="{{ image._project_image }}"
{{ /each }}
在我的 gemfile 中,我使用 rails '4.2.0.beta4' 和 active_model_serializers '0.8.3'
我可以看出,如果您有很多属性要转换为字符串、整数等,这种解决方法可能会变得很麻烦,但它至少在短期内有效。
希望这对某人有所帮助,再次感谢 DavidKovsky 的帮助。