Rails 验证不适用于更新

Rails Validates don't work on update

我遇到了验证器的问题。我有一个 "contact" 模型,其中包含两个字段 firstname 和 lastname,我希望在 CREATE 和 UPDATE 方法中都需要。当我创建一条没有数据的记录时,服务器 return 给我一个 422 并进行回滚。还行吧。但是,当我更新记录时,尽管服务器进行了回滚,但服务器没有 return 错误 422。我需要错误的 return 来在客户端管理它。

所以我使用这样的验证器:

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

有人可以帮助我吗?

提前致谢。

你可以试试下面的代码,可能是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
Contact.find(params[:id]).update(contact_params)

returns 一个布尔值,因此你告诉 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

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