Ruby on rails Rails验证don';我不想更新

Ruby on rails Rails验证don';我不想更新,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我的验证器有问题。我有一个“联系人”模型,它包含两个字段firstname和lastname,我希望CREATE和UPDATE方法都需要这两个字段。当我创建一个没有数据的记录时,服务器返回422并执行回滚。这没关系。但是,当我更新记录时,服务器不会返回错误422,尽管服务器执行回滚。我需要返回错误以在客户端管理它 因此,我使用如下验证程序: class Contact < ActiveRecord::Base validates :lastname, presence: tr

我的验证器有问题。我有一个“联系人”模型,它包含两个字段firstname和lastname,我希望CREATE和UPDATE方法都需要这两个字段。当我创建一个没有数据的记录时,服务器返回422并执行回滚。这没关系。但是,当我更新记录时,服务器不会返回错误422,尽管服务器执行回滚。我需要返回错误以在客户端管理它

因此,我使用如下验证程序:

class Contact < ActiveRecord::Base
    validates :lastname,    presence: true
    validates :firstname, presence: true
end
class联系人
我的控制器是:

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 contacts控制器
我有一个序列化程序:

class ContactSerializer < ActiveModel::Serializer
    attributes :id, :lastname, :firstname, :created_at, :updated_at
end
class ContactSerializer
有人能帮我吗


提前感谢。

您可以尝试以下代码,它可能是tempo fix

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
返回一个布尔值,所以您告诉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 :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

您可以重构其他操作以删除重复查找器。

此操作的可能重复修复了我的问题。谢谢
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