ruby-on-rails – 如何使用Ember Data&Rails在单个Ember.js
我无法使用Ember.js,Ember Data和Rails确定使用单个表单保持hasMany关联的正确方法.客户有很多项目.我有一个新的项目表单,有两个字段:项目名称和客户端名称.
http://cl.ly/image/3z0P0R3M1t2u
我试图将我的创建逻辑保留在Ember.js ClientsController& ProjectsController,但是我需要将其中的一部分移动到我的ProjectsNewView上的提交操作吗? 更新:我在找到这个issue之后更新了我的代码.我越来越近了,但是Rails ProjectsController仍然没有收到关联的client_id.它不是控制器接收的参数的一部分.我觉得我可能不是最好的方式. 楷模: 轨道 class Client < ActiveRecord::Base attr_accessible :name has_many :projects accepts_nested_attributes_for :projects validates :name,:presence => true end class Project < ActiveRecord::Base attr_accessible :name,:client_id belongs_to :client validates :name,:presence => true validates :client,:presence => true end Ember.js App.Client = DS.Model.extend name: DS.attr('string') projects: DS.hasMany('App.Project',{ embedded: true }) validate: -> if @get('name') is null or @get('name') is '' 'Client requires a name.' App.Project = DS.Model.extend name: DS.attr('string') client: DS.belongsTo('App.Client') validate: -> if @get('name') is `undefined` or @get('name') is null or @get('name') is '' return 'Projects require a name.' if @get('client') is `undefined` or @get('client') is null or @get('client') is '' 'Projects require a client.' 控制器: 轨道 class Api::ClientsController < Api::BaseController def create @client = Client.find_or_create_by_name(params[:client][:name]) respond_to do |format| if @client.save format.json { render json: @client,status: :create } else format.json { render json: @client.errors,status: :unprocessable_entry } end end end end class Api::ProjectsController < Api::BaseController def create @project = Project.new(params[:project]) respond_to do |format| if @project.save format.json { render json: @project,status: :created,location: @project } else format.json { render json: @project.errors,status: :unprocessable_entry } end end end end Ember.js App.ClientsController = Em.ArrayController.extend createClient: (data) -> @transaction = App.store.transaction() client = @transaction.createRecord(App.Client,data) project_data = data.projects_attributes[0] client.get('projects').createRecord(project_data) validation_errors = client.validate() if validation_errors App.displayError validation_errors client.destroy() else @transaction.commit() App.ProjectsController = Em.ArrayController.extend createProject: (data) -> @transaction = App.store.transaction() project = @transaction.createRecord(App.Project,data) validation_errors = project.validate() if validation_errors App.displayError validation_errors project.destroy() else @transaction.commit() App.get('router').transitionTo('projects') 浏览次数: Ember.js App.ProjectsNewView = Em.View.extend classNames: ['form row'] tagName: 'form' templateName: 'projects/new' init: -> @_super() submit: (event) -> event.preventDefault() client = {} client.name = @get('client') project = {} project.name = @get('name') client.projects_attributes = [] client.projects_attributes.push project App.router.clientsController.createClient(client) 解决方法
@David我不是专家,但我再次查看你的问题,我想要获得相关的client_id,你必须在RestAdapter上调用toJSON方法并传递它:
{associations: true} 以下链接说明了如何做到这一点: https://stackoverflow.com/questions/10184213/is-there-a-way-to-post-embedded-objects-back-to-the-api-with-ember-data Ember-data embedded objects stored as separate objects Emberjs – unable to query for embedded model or association 更新 在我回答代码中使用toJSON的位置的问题之前,我想回到我刚刚用代码设计观察到的东西. 您正尝试在子记录中创建parentRecord,因为Client是父项,而project是子项.如果你观察得很好,你链接到的issue-115,断然说将使用parentRecord商店来创建记录.此外,如果你在问题pull-request that was merged中检查关于issue-115的测试,你会再次看到它在parentRecord中创建一个子记录. 但是你正在反过来,即在子记录中创建parentRecord.你需要扭转这种局面. 另外,在rails模块中,在Client Model中,您调用了accepts_nested_attributes_for:projects,就像emberjs一样,它只允许您从Client创建项目记录,反之亦然.有关如何在rails guide,railscasts和nested attributes中使用accepts_nested_attributes_for的所有示例都显示了从父模型中的表单创建的子模型的字段. 所以rails和emberj都在这个用例中从子记录创建parentRecord.这可能是您遇到client-id问题的原因.所以扭转你的设计并再试一次.如果它仍然没有发送客户端ID.然后你应该在客户端模型上调用toJSON,它是first link中显示的父关联,来自我发布的初始链接,建议你在restAdapter中调用toJson上的{associations:true}. App.Client ## toJSON: (options={}) -> options['associations'] = true @_super(options) 我希望这有帮助.请回顾一下有效或无效的内容,以便遇到类似问题的其他人发现这篇文章可以知道从哪里开始. 最后,使用active_model_serializer gem创建rails api并不会有什么坏处,这是ember-core团队推荐的用于为ember-data和RestAdapter创建rails api的宝石.通过这种方式,您可以从ember端和rails端侧载和嵌入关联. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iphone – 您已经购买此订阅.点击购买以续订或延长它
- iOS – NSJSONSerialization:无法将数据转换为字符串周围的
- c# – 如何将System.Diagnostics.Trace和System.Diagnostic
- ruby-on-rails – 如何向ActiveAdmin表单添加自定义html或按
- ruby-on-rails – Rails与没有模型的表关联
- c# – StackExchange.Redis ConnectionMultiplexer.Connect
- c – 如何检查是否定义了const char *的值?
- 正则表达式unicode字符在vim中
- ruby中的大矩阵代数计算
- iphone – 应用程序加载器停留在“测试tcp udp连接”