【问题标题】:Rails nested attributes type mispatch errorRails 嵌套属性类型不匹配错误
【发布时间】:2016-04-05 09:25:37
【问题描述】:

我正在使用rails_api gem 创建一个rails api,我有一个模型名称User 和另一个模型名称Identity

我面临的问题是,每当我尝试使用nested_attributes 从参数创建用户时,它都会给我ActiveRecord::AssociationTypeMismatch error

模型

用户.rb

class User < ActiveRecord::Base
    enum gender: [:male , :female]
    has_many :identities ,dependent: :destroy
    accepts_nested_attributes_for :identities
    has_secure_password
end

身份.rb

class Identity < ActiveRecord::Base
    belongs_to :user
    validates_associated :user
end

控制器

users_controller.rb

class UsersController < ApplicationController

def create      
    @user = User.new user_params
    #@user.build.identities(user_params[:identities])
    if @user.save
        render json: @user , status: :created
    else
        render json: @user.errors, status: :unprocessable_entity
    end
end

private
def user_params
    json_params = ActionController::Parameters.new( JSON.parse(request.body.read) )
    json_params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :location, :gender,{identities: [:provider, :uid, :url, :token, :expires_at]})
end

结束

我将数据作为 json 对象发送:

这是服务器控制台中的错误:

请帮我解决这个问题。我已经尝试了所有可能的解决方案。提前致谢

【问题讨论】:

  • 我认为这是因为您只是将一个数组发送到 identities 属性!您必须为身份属性提供身份记录!
  • 你不认为json_params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :location, :gender,{identities: [:provider, :uid, :url, :token, :expires_at]}) 应该是json_params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :location, :gender,identities_attributes: [:provider, :uid, :url, :token, :expires_at]) 吗?

标签: ruby-on-rails ruby json rails-activerecord nested-attributes


【解决方案1】:

你的强参数应该是这样的:

json_params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :location, :gender,identities_attributes: [:provider, :uid, :url, :token, :expires_at])

【讨论】:

  • 我更改了强参数,但出现了Unpermitted parameter: identities error
  • 您应该在参数 identities_attributes 中发送身份数组:[{ }]
【解决方案2】:
json_params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :location, :gender, :identities => [:provider, :uid, :url, :token, :expires_at])

这将以当前方式解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多