Rails验证不会更新

时间:2015-01-02 21:16:27

标签: ruby-on-rails ruby validation

验证器出了问题。我有一个“联系”模型,其中包含两个字段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

有人可以帮助我吗?

先谢谢。

2 个答案:

答案 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