Ember属于保存

时间:2015-06-11 15:44:25

标签: javascript ruby-on-rails ruby ember.js ember-cli

Ember CLI 0.2.5 + Rails 4.2使用ember-cli-rails gem,active_model_serializer(0.9.3)

我目前正在尝试将用户传递给createRecord,并且在传递给rails时它不会保存或绑定user_id。参数返回:

{"course"=>{"subject"=>"CSE", "number"=>110, "credit_hours"=>3, "grading_scale"=>"Regular", "user_id"=>nil}}

Ember控制器(查找用户返回正确的值)

import Ember from 'ember';

export default Ember.Controller.extend({
  scales: ['Regular', 'Plus/Minus', 'Plus', 'Minus'],
  weights: [],

  actions: {
    createCourse: function() {
      var self = this;
      var course = this.get('model');
      this.store.find('user', this.get('session.content.secure.id')).then(function(user) {
        course.set('user', user);
      })
      course.save().then(function(course){
        $.growl.notice({title: 'Course', message: 'Sucessfully created course.'})
      })
    }
  }
});

Rails控制器

    class CoursesController < ApplicationController

  def index
    @courses = User.find(params[:user_id]).courses
    render json: @courses
  end

  def show
    @course = Course.find(params[:id])
    render json: @course
  end

  def update
    @course = Course.find(params[:id])
    if @course.update_attributes(params[:course])
      render json: @course
    else
      render json: @course.errors, status: 500
    end
  end

  def create
    @course = Course.new(course_params)

    if @course.save
      render json: @course, status: :created
    else
      render json: @course.errors, status: 500
    end
  end

  private

  def course_params
    params.require(:course).permit(:subject, :number, :credit_hours, :grading_scale, :user_id)
  end

end

Serializer(我的堆栈级别太深了错误,所以我使用了之前看过的user_id,我甚至降级到0.8.3来修复错误但仍然没有运气)

class CourseSerializer < ActiveModel::Serializer
  embed :ids, include: false

  attributes :id, :subject, :number, :credit_hours, :grading_scale, :user_id
  #has_one :user
  has_many :weights
  has_many :grades
end

路线(这里很简单)

import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model: function() {
    var store = this.store;
    return store.createRecord('course');
  },
  setupController: function(controller, model) {
    controller.set('model', model);
  },
  actions: {
    willTransition: function() {
      var course = this.controller.get('model');
      course.rollback();
    }
  }
});

课程模型片段

export default DS.Model.extend({
  user: DS.belongsTo('user'),
  weights: DS.hasMany('weight',{ async: true }),
  grades: DS.hasMany('grade',{ async: true }),
  subject: DS.attr('string'),
  number: DS.attr('number'),
  creditHours: DS.attr('number'),
  gradingScale: DS.attr('string')

用户模型片段

export default DS.Model.extend({
  courses: DS.hasMany('course'),
  grades: DS.hasMany('grade'),
  email: DS.attr('string'),
  name: DS.attr('string'),
  gradePoints: DS.attr('number'),
  gradeUnits: DS.attr('number'),
  password: DS.attr('string'),
  password_confirmation: DS.attr('string')

如果我需要提供其他任何东西,请告诉我。这让我很沮丧。

1 个答案:

答案 0 :(得分:2)

createCourse承诺解决之前course.save()方法user运行,这就是您看user_id: nil的原因。这可行:

createCourse: function() {
   var self = this;
   var course = this.get('model');
   this.store.find('user', this.get('session.content.secure.id')).then(function(user) {
      course.set('user', user);
      return course.save();
   }).then(function(course) {
       $.growl.notice({title: 'Course', message: 'Sucessfully created course.'});
   });
}