我正在使用前端的Ember 2.0和后端的Rails 4.2创建一个在线表单构建器,其中包含json_api_resources gem。
在发布表单的过程中,用户必须能够将一段代码剪切/粘贴到他/她的网页中,以便'ajax in'他们配置的表单。
因此,Form模型的'embed-snippet'属性应该是只读的。当用户对表单进行更改并重新保存记录时,我不希望将代码段字段的内容发送回服务器。
我考虑过一些方法:
理想情况下,有更好的方法可以解决这个问题。
类似的东西:
'DS.attr('string', { readOnly: true })
所以我的问题是,确保此字段内容不会被发送回服务器的最佳方法是什么?
答案 0 :(得分:22)
要获得{ readOnly: true }
功能(这样可以更轻松地添加新模型/ attrs),您可以自定义serializeAttribute
上的JSONAPISerializer
方法:
(在serializers/application.js
中):
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
serializeAttribute(snapshot, json, key, attribute) {
// do not serialize the attribute!
if (attribute.options && attribute.options.readOnly) {
return;
}
this._super(...arguments);
},
});
答案 1 :(得分:17)
最简单的方法是为表单模型创建自定义序列化程序,并使用attrs
属性来阻止该属性被序列化。
在app/serializers/form.js
:
export default DS.JSONAPISerializer.extend({
attrs: {
embedSnippet: { serialize: false }
}
});
有关attrs的更多信息和示例,请参阅API文档http://emberjs.com/api/data/classes/DS.JSONSerializer.html#property_attrs
答案 2 :(得分:3)
您也可以使用json-api-resources
从后端控制此项。无论适当的资源文件是什么,您都可以控制允许从后端检索哪些属性以及后端允许哪些属性接受。像这样:
def self.fetchable_fields(context)
super - [
:whatever_attribute_not_to_fetch_from_backend
]
end
def self.creatable_fields(context)
super - [
:embed_snippet,
:another_attribute_not_accepted_from_post
]
end
这可能不是您正在寻找的内容,因为它不会阻止属性发送到后端,而是阻止它们接受< / em>的。但这是另一种选择。
根据您的使用情况,您可能还需要使用此功能:
def self.updatable_fields(context)
super - [:whatever]
end