首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在rails api中保存mongoid文档中的嵌套属性

在rails api中保存mongoid文档中的嵌套属性
EN

Stack Overflow用户
提问于 2016-07-22 03:36:27
回答 1查看 621关注 0票数 0

我试图有一个iphone用户能够创建一所学校和多个管理员在同一时间。但是,当我尝试使用嵌套属性保存学校时,它返回错误admins is invalid

学校模式

代码语言:javascript
运行
复制
class School
    include Mongoid::Document
    include Mongoid::Timestamps

    # Callbacks
    after_create :spacial

    embeds_many :admins
    accepts_nested_attributes_for :admins
  validates_associated :admins

    # Fields
    field :school_name, type: String

end

管理模型

代码语言:javascript
运行
复制
class Admin
  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :school

  before_create :generate_authentication_token!

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

学校控制器

代码语言:javascript
运行
复制
class Api::V1::SchoolsController < ApplicationController
    def show
        respond_with School.find(params[:id])
    end
    def create
        school = School.new(school_params)
        admin = school.admins.build
        if school.save
            render json: school, status: 201, location: [:api, school]
        else
            render json: { errors: school.errors }, status: 422
        end
    end

    private

    def school_params
        params.require(:school).permit(:school_name, admins_attributes: [:email, :password, :password_confirmation])
    end
end

参数

代码语言:javascript
运行
复制
Parameters: {"school"=>{"school_name"=>"Curry College", "admins_attributes"=>{"0"=>{"email"=>"test@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}}}, "subdomain"=>"api"}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-22 14:44:04

试试这个:

代码语言:javascript
运行
复制
class Api::V1::SchoolsController < ApplicationController
  def create
    school = School.new(school_params)
    if school.save
        render json: school, status: 201, location: [:api, school]
    else
        render json: { errors: school.errors }, status: 422
    end
  end

  private

  def school_params
    params.require(:school).permit(:school_name, admins_attributes: [:email, :password, :password_confirmation])
  end
end

由于您已允许在控制器中使用admins_attributes,因此在将school_params分配给School.new时,它们将自动分配给新的Admin对象。您不需要在那里显式地构建一个管理员。

您得到的错误是因为您正在构建一个admin admin = school.admins.build,但没有为其分配任何属性,因此在此Admin对象上的验证失败。所以,你可以完全跳过这一行,试试我上面的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38512934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档