(次が読みにくい場合は、最後の行をお読みください)。しばらくの間、Ember と Rails のバックエンドを使用していますが、トランザクションやバックエンドにアクションを送信するために使用される他の方法にまだ少し固執しています。と がUsers
ありEvents
ます。Users
1つまたは複数Events
に参加でき、それぞれにEvent
複数の参加Users
が可能です。この関係は、次のように Mongoid マクロを使用して維持していhas_and_belongs_to_many
ます。
イベント
# ...
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
、バックエンドに保存されているすべてのリストと、User
まだ出席していない場合は「出席」ボタン、出席している場合は「出席しない」ボタンを表示していUser
ます。参加するために、トランザクションを使用して PUT リクエストを作成し、Ember イベント コントローラーで次の手順を実行しようとしました。
イベント コントローラー (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"]}}
そして、ベイクエンドは422 Unproccesable entity
答えを返しています...このフィールドでモデルの検証を行っていないため、ここで何が起こっているのかわかりません... Railsイベントコントローラーでの更新アクションは次のとおりです。
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
最後の詳細: 私は Ember 1.0.0.rc6、jQuery 1.10.2、および gemsacts_as_api
をactive_model_serializers
Rails で使用しています。
要約すると、Ember で PUT リクエストだけを実行して、has_many_and_belongs_to
マクロ(トランザクション、jQuery、またはその他を使用) を介してイベントに参加しているユーザーを追加したいと考えています。