(如果下一个对您来说太多阅读,请阅读最后一行)。我有一段时间使用 Ember 和 Rails 后端,但我仍然有点坚持事务或使用其他方式将操作发送到后端。我有Users
和Events
。我Users
可以参加一个或几个Events
,并且每个Event
几个Users
都可以参加。我has_and_belongs_to_many
以这种方式使用 Mongoid 宏来维持这种关系:
事件
# ...
has_and_belongs_to_many :attendings, class_name: "User" , inverse_of: :attendances
# ...
用户
# ...
has_and_belongs_to_many :attendances, class_name: "Event" , inverse_of: :attendings
# ...
在我的模板中,我显示了所有存储在我的后端的列表,如果尚未参加,Events
则显示一个按钮“参加”,如果参加,则显示“不参加” 。为了参加,我尝试使用事务发出 PUT 请求,在我的 Ember 事件控制器中进行下一步:User
User
事件控制器(Ember),actionAttending
使用事务的方法:
actionAttending: function() {
var userId = this.get('controllers.app.model.id');
this.transaction = this.get('store').transaction();
this.get('attendings').pushObject(App.User.find(userId));
this.transaction.add(this.get('model'));
this.transaction.commit();
}
当我尝试这个时,我的Event
JSON 请求包含除了attendings
属性之外的所有参数和关系。所以我决定尝试使用 jQuery 请求:
事件控制器(Ember),使用 jQuery ajax 的 actionAttending 方法:
// ...
var eId = this.get('id');
this.get('attendings').pushObject(App.User.find(userId));
var eAttendings = this.get('attendings');
var url = "/events/" + eId + ".json";
var data = { event: { id: eId, attendings: eAttendings } };
$.ajax({
type: "PUT",
url: url,
data: data,
dataType: "JSON"
});
// ...
好吧,这几乎是有效的,除了我声明的那一行eAttendings
,Ember 抱怨init
函数没有被调用,或者类似的东西。谷歌搜索了一下后,我找到了一个“解决方案”,它转换为数组,所以行改变如下:
var eAttendings = this.get('attendings').toArray();
我现在很好的错误是:
TypeError: fullName is undefined
var nameParts = fullName.split(":"),
这是在我的 ajax 请求启动之前在 Firebug 中提出的。我不知道确切的含义是什么或如何解决它...
无论如何,我想尝试一下我的 ajax 请求是否有效,所以我在 curl 中尝试了它:
curl --request PUT localhost:3000/events/521b97ef5ef9095ba211bf70 --data "id=521b97ef5ef9095ba211bf70&attendings=521b7eda99027121d1533015"
答案是:
{"errors":{"attendings":["is invalid"]}}
并且bakend正在返回一个422 Unproccesable entity
答案......我在这个领域没有对我的模型进行验证,所以我也不知道这里发生了什么......我在Rails Event控制器上的更新操作是这样的:
def update
e = Event.find(params[:id])
u = User.find(params[:attendings])
if params[:attendings]
e.attendings << u
e.save
respond_with e, api_template: :general_event, status: :no_content
end end
最后一个细节:我在 Rails 中使用 Ember 1.0.0.rc6、jQuery 1.10.2 和acts_as_api
gems active_model_serializers
。
所以,总而言之,我想在 Ember 中处理我的 PUT 请求,以通过宏添加参加事件的用户has_many_and_belongs_to
(使用事务、jQuery 或其他东西)