验证器出了问题。我有一个“联系”模型,其中包含两个字段firstname和lastname,我想要在CREATE和UPDATE方法上都需要。当我创建一个没有数据的记录时,服务器返回422并执行回滚。还行吧。但是当我更新记录时,服务器不会返回错误422,尽管服务器执行回滚。我需要返回错误来在客户端管理它。
所以我使用这样的验证器:
class Contact < ActiveRecord::Base
validates :lastname, presence: true
validates :firstname, presence: true
end
我的控制器是:
class ContactsController < ApplicationController
respond_to :json
def index
respond_with Contact.all
end
def create
respond_with Contact.create(contact_params)
end
def show
respond_with Contact.find(params[:id])
end
def edit
respond_with Contact.find(params[:id])
end
def update
respond_with Contact.find(params[:id]).update(contact_params)
end
def destroy
respond_with Contact.find(params[:id]).destroy
end
private
def contact_params
params.require(:contact).permit(:lastname, :firstname, :position)
end
end
我有一个序列化器:
class ContactSerializer < ActiveModel::Serializer
attributes :id, :lastname, :firstname, :created_at, :updated_at
end
有人可以帮助我吗?
先谢谢。
答案 0 :(得分:2)
Contact.find(params[:id]).update(contact_params)
返回一个布尔值,因此你告诉Rails渲染一个布尔值(它将渲染一个200,布尔序列化为JSON)。
同样的破坏。您需要传递实例。
def update
contact = Contact.find(params[:id])
contact.update(contact_params)
respond_with contact
end
def destroy
contact = Contact.find(params[:id])
contact.destroy
respond_with contact
end
在before_action
中提取取景器也是一个好习惯。
before_action :find_contact
def update
@contact.update(contact_params)
respond_with @contact
end
def destroy
@contact.destroy
respond_with @contact
end
protected
def find_contact
@contact = Contact.find(params[:id])
end
您可以重构其他操作以删除重复的查找程序。
答案 1 :(得分:0)
您可以尝试以下代码,它可以是速度修复
def update
@contact = Contact.find params[:id]
@contact.update contact_params
if @contact.errors.count > 0
# do you like
else
respond_with @contact
end
end