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
您可以重构其他操作以删除重复的查找器。
我遇到了验证器的问题。我有一个 "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
您可以重构其他操作以删除重复的查找器。