【问题标题】:Ember Data: Trying to make a Child Record persist in Rails 4 backendEmber 数据:尝试使子记录在 Rails 4 后端中持久存在
【发布时间】:2014-05-06 17:25:00
【问题描述】:

我已经搜索了很多这个问题的答案,我觉得我很接近......

我有测验、问题和答案模型。

导轨--

测验有_许多问题

问题有_很多答案

余烬--

Quizzmob.Quiz = DS.Model.extend
    title: DS.attr('string')
    questions: DS.hasMany('question')


Quizzmob.Question = DS.Model.extend
    prompt: DS.attr('string')
    quiz: DS.belongsTo('quiz')

我可以通过一个简单的 save() 将一个新测验保存到我的 Rails 后端。 我还侧载了 JSON,所以它看起来像这样:

{"questions":[
    {"id":214,"prompt":"Is this a question?"}  //--added manually--//
],
"quizzes":[{"id":185,"title":"First Quiz","questions":[214]},
    {"id":186,"title":"Second Quiz","questions":[]},
    {"id":187,"title":"Third Quiz","questions":[]},
    ...
    ...
]}

这是我在寻找答案时多次看到的模式:

Ember QuestionsNewController:

Quizzmob.QuestionsNewController = Ember.ArrayController.extend(

    needs: 'quiz'
    quiz: Ember.computed.alias('controllers.quiz.model')
    prompt: ''

    actions:
        save: ->
            quiz = @get('controllers.quiz.content')
            quiz.save()
            prompt = @get('prompt')

            question = @store.createRecord "question",
                prompt: prompt

            @set('prompt', '')

            questions = quiz.get('questions')
            questions.addObject(question)
            question.save().then =>
                quiz.save()
)

我的控制台显示所有成功的调用,我的服务器也显示成功:

Processing by Api::V1::QuestionsController#create as JSON
Parameters: {"question"=>{"prompt"=>"new", "quiz_id"=>"185"}}
Completed 200 OK

Processing by Api::V1::QuizzesController#update as JSON
Parameters: {"quiz"=>{"title"=>"First Quiz"}, "id"=>"185"}
Completed 200 OK

创建了一个新的问题模型,我在 Ember 调试器中看到了它,但是当我刷新页面时,模型消失了。我在某处读到它可能与我的序列化程序有关,并且我可能必须添加一个“serializeHasMany”方法来自定义它……但这对于看似简单和常见的任务来说似乎需要做很多工作。不确定这是否是“余烬之道”。

非常感谢您的帮助。我将使用所需的任何其他信息更新问题。

【问题讨论】:

    标签: ruby-on-rails-4 ember.js ember-data


    【解决方案1】:

    我的数据库中有类似类型的关系,我想我明白您的问题所在。使用 ember,不会在 hasMany 方面保存关系。因此,关系将在问题表中的数据库中完全定义。要查找测验的所有问题,您必须根据

    {quiz_id: SOME_ID}
    

    现在要问自己的一个问题是,这些问题可以放在一个测验中吗?如果他们可以参加许多测验,那么您就有了 manyToMany 关系,这可能需要更改序列化程序,因为我必须自己做。

    总之,你的问题列表没有被更新或发送到服务器的原因是你只能将关系添加到问题本身,所以 question.set('quiz', some_quiz)。您无法从测验中获得所有问题。

    我希望这会有所帮助,对不起所有的措辞。

    【讨论】:

    • 我尝试在问题初始化中添加一个测验,但我遇到的问题是 rails 4 中的强参数。'quiz' 不是我的'question' 的允许参数导轨后端。这是一个很好的问题。我不一定希望问题属于测验。它可能应该是多对多关系。感谢您的提示,这将使我在搜索时更加专注。
    • 很高兴我能帮上忙。仅供参考,这是我必须用来保存 manyToMany 的代码。如果您需要,可以为您节省一些搜索。 APP.ApplicationSerializer = DS.ActiveModelSerializer.extend({ primaryKey: '_id', serializeHasMany: function(record, json, relationship) { var key = relationship.key; // don't care which kind of hasMany relationship this is json[key] = Ember.get(record, key).mapBy('id'); } });
    • 非常感谢!这肯定很快就会派上用场。
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2019-09-27
    相关资源
    最近更新 更多