天道酬勤,学无止境

save(:validate => false) 涵盖了什么?(What is covered by save(:validate => false)?)

问题

我刚刚使用这样的代码实现了一些自定义counter_cache

def after_save
    self.update_counter_cache
end
def after_destroy
    self.update_counter_cache
end
def update_counter_cache
    self.company.new_matchings_count = Matching.where(:read => false).count
    self.company.save
end

我的问题是 - 命令Model.save(:validate => false)除了validates_withbefore_validation类的东西之外,实际上before_validation防止什么?

如果我保留现有保存而不进行验证,我的自定义 counter_caches 会受到影响吗?

回答1

如果你传入 :validate=>false,它会跳过有效的? 命令。 其他一切功能相同。

您可以在此处查看代码:http://api.rubyonrails.org/classes/ActiveRecord/Validations.html

def save(options={})
  perform_validations(options) ? super : false
end

...

if perform_validation
  valid?(options.is_a?(Hash) ? options[:context] : nil)
else
  true
end
回答2

在 Rails 4.2.6 上测试表明.save(:validate=>false)实际上会跳过before_validationsafter_validation回调。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • What is covered by save(:validate => false)?
    I just implemented a number of custom counter_caches using code like this: def after_save self.update_counter_cache end def after_destroy self.update_counter_cache end def update_counter_cache self.company.new_matchings_count = Matching.where(:read => false).count self.company.save end My question is this - what does the command Model.save(:validate => false) actually prevent beyond things like validates_with or before_validation? Will my custom counter_caches be affected if I keep my existing saves without validation?
  • Django 表单 - 如何覆盖字段验证(Django forms - how to override field validation)
    问题 在表单中,我有某些未正确验证的字段。 我希望覆盖 django 验证并使用我自己的验证。 当我覆盖clean()方法时,字段self.errors已经填充了来自错误验证字段的错误。 我应该覆盖哪种方法,这些错误是在哪里产生的? 通过覆盖clean()和类似的方法,只能实现对 django 默认验证的扩展。 我想防止这种默认验证发生。 编辑:尝试验证器这是我尝试过的: 253 def validate_gallery(value): 254 print 'validate galley' 255 return True 256 257 def validate_cover_photo(value): 258 print 'validate_cf' 259 return True 260 261 cover_photo_widget = SelectWithDefaultOptions(attrs={ 262 'class': 'chosen-select-no-single', 263 'id': 'select-cover-photo', 264 'data-placeholder': 'Select Cover Photo', 265 'style': 'width: 200px;', 266 'tabindex': '-1', 267 }); 268 269
  • SpringBoot 与注解 @Validated 结合对数据进行验证
    在检验 Controller 的入参是否符合规范时, 使用 @Validated 来校验传入数据, 如果数据异常则会统一抛出异常,方便异常中心统一处理 测试工具可以使用 Postman 个人感觉还是很不错的 1 对象中添加对应功能注解 @Validated 相关作用注解标签需要加在 bean 实体的属性上 import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import java.util.Date; ​ /** * @ClassName: StudentVO * @Description: 学生实体 * @Author mac * @Date 2019/6/11 上午10:26 **/ @Data public class StudentVO { ​ /** * 姓名 */ @NotNull(message = "学生姓名不能为空") private String name; ​ /** * 身高 */ @NotNull(message = "学生身高不能为空") private Integer stature; ​ /** * 体重 */ @NotNull(message = "学生体重不能为空") private Integer weight; ​ /**
  • Django forms - how to override field validation
    In a form I have certain fields, that are not validated correctly. I wish to override the django validation and put my own instead. When I override the clean() method, the field self.errors is already filled with errors from the wrongly validated fields. Which method should I override, where are these errors generated? With overriding clean() and similar methods, one can achieve only extension to the django default validation. I want to prevent this default validation from happening. Edit: tried validators Here is what I tried: 253 def validate_gallery(value): 254 print 'validate galley' 255
  • 多模型保存,如何封装事务并报错(Multi model saving, how to wrap in transaction and report errors)
    问题 我有一个注册表模型,可以在注册过程中接受用户输入: class RegForm include ActiveModel::Model include ActiveModel::Validations attr_accessor :company_name, :email, :password validates_presence_of # ... end 在此注册过程中,我需要创建多个模型,但我不确定如何正确显示错误消息以及如何将模型错误消息冒泡回 UI。 if @reg_form.valid? account = Account.create!(@reg_form) else ... 帐户.创建! 看起来像: def self.create!(reg_form) account = Account.create_from_reg!(reg_form) location = location.create_from_reg!(account, reg_form) .. .. account.location = location .. account.save! account end 所以我很困惑如何为所有这些正在保存的模型显示错误消息如果 reg_form 没有所有其他模型的正确数据,如何显示或验证失败。 如何确保将其包装在事务中,因此如果任何模型在注册期间未能保存
  • 未定义的方法“保存”使测试在测试结束之前失败(undefined method `save' making test fail before testing to the end)
    问题 我正在关注 ruby​​.railstutorial.org。 我遇到了一些麻烦,但我解决了它们。 但是,现在我在谷歌上搜索了很长时间,检查了代码,我什至知道测试失败的原因,但不知道如何使其通过。 所以,问题来了。 我有一个用户模型: class User < ActiveRecord::Base attr_accessible :email, :name validates :name, presence: true, length: {maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } end 该问题与不区分大小写的唯一性检查有关。 Rspec 中的测试是: before { @user = User.new(name: "Example User", email: "user@example.com") } subject { @user } describe "when email address is already in use" do before do
  • 模型表格保存。 获取保存的对象(Model form save. Get the saved object)
    问题 如果我有一个模型表单并将其保存为: f = FormModel(request.POST) if f.is_valid(): f.save() 我怎样才能取回刚刚保存的对象? 回答1 当您保存模型表单时,它会返回模型的保存实例。 所以你所要做的就是将它分配给一个变量: f = MyModelForm(request.POST) if f.is_valid(): m = f.save() 除非您正在处理更复杂的数据,否则您不需要弄乱commit=False或任何这些东西。 回答2 如果您知道模型已保存(以便存在正确的实例),您还可以执行以下操作: model = form.instance 回答3 啊我刚发现这个! # Create a form instance with POST data. >>> f = AuthorForm(request.POST) # Create, but don't save the new author instance. >>> new_author = f.save(commit=False) # Modify the author in some way. >>> new_author.some_field = 'some_value' # Save the new instance. >>> new_author.save() #
  • 使用MiniTest检查模型上的方法调用(Check method call on model using MiniTest)
    问题 如果我使用的是RSpec,则可以测试是否像下面这样调用方法: expect(obj).to receive(:method) MiniTest中的等效功能是什么? 我有一个Post模型,它具有一个before_validation回调,该回调运行一个方法create_slug 。 在我的测试test/models/post_test.rb我想确保在调用post.save时正在调用create_slug方法。 Minitest :: Spec文档说,我可以使用方法must_send来检查是否调用了一个方法。 但是,当我尝试@post.must_send :create_slug ,出现以下错误: NoMethodError: undefined method `must_send' for #<Post:0x007fe73c39c648> 我在test_helper.rb文件中包含Minitest :: Spec: ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require 'minitest/spec' class ActiveSupport::TestCase # Setup all
  • 基于字段是否具有值的django表单验证(django form validation based on whether field has value)
    问题 当我提交一个选择了phone_type的空表单(对于formHomePhone )时,表单返回其自身,而没有在phone_type选择的值规定This field is required 从视图中可以看出,表单中的第一个电话号码是必需的,但其他电话号码不是。 如果存在价值,我只想处理它们。 尽管当我在空表单上单击提交时,附加电话号码字段会从UKPhoneNumberField > Phone number must include an area code.抛出错误,但Phone number must include an area code. 如何仅在受尊重的字段中有数字时进行验证? 我有一个这样的 view.py 文件 def new_client_view(request): if request.method == 'POST': formDetails = ClientDetailsForm(request.POST) formAddress = ClientAddressForm(request.POST) formHomePhone = ClientPhoneForm(request.POST) formWorkPhone = ClientOtherPhoneForm(request.POST) formMobilePhone =
  • laravel 图像验证图像干预(laravel image validation image intervention)
    问题 我的 vue js 组件中有一个文件上传,它在服务器中发送 base64 methods: { onFileChange(e) { console.log(e.target.files[0]); let fileReader = new FileReader(); fileReader.readAsDataURL(e.target.files[0]); fileReader.onload = (e) => { this.product.cover_image = e.target.result }; }, <div class="form-group"> <label for="exampleInputFile">Upload Image of Product</label> <input type="file" ref="fileupload" v-on:change="onFileChange" id="exampleInputFile"> </div> 在我的 Laravel 控制器中,我使用图像干预通过Image::make保存图像 public function store(Request $request){ $this->validate($request, [ 'name' => 'required|max:255', 'price' => 'required
  • 为什么当我尝试user.save时,我的rails会回滚?(Why does my rails rollback when I try to user.save?)
    问题 我已经安装了RailsTutorial示例应用程序(类似Twitter的应用程序),并试图理解为什么当我尝试更新用户db时以下控制台代码无法更新数据库。 我希望一旦使用user.save ,用户信息就会得到更新。 但是,这回滚到未编辑的数据。 这是由于基于用户的限制吗? 用户控制器: class UsersController < ApplicationController #before_filter :signed_in_user, only: [:index, :edit, :update, :destroy, :following, :followers] # By default before filters apply to all actions #before_filter :correct_user, only: [:edit, :update] def edit @user = User.find(params[:id]) end def update @user = User.find params[:id] respond_to do |format| if @user.update_attributes(params[:user]) flash[:notice] = "Profile updated" format.html { redirect
  • Django 表单集无效 - 为什么不?(Django formset is not valid- why not?)
    问题 我试图用一个表单,允许用户上传图片到存储在数据库中我的Django项目的项目,不过,我目前得到那个声音告诉我的控制台输出formset我使用的是无效... 我试图用来将图像上传到项目的视图已定义为: def upload_budget_pdfs(request, project_id): project = Project.objects.get(id=project_id) print("Value of project in 'upload_budget_pdfs()': ", project) presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn') print("Value of presentations in 'upload_budget_pdfs()': ", presentations) drawing_formset =
  • 究竟是什么保存/保存! 做?(What exactly does save/save! do?)
    问题 我注意到 rails 中的一个常见错误检查行是: if @user.save! 而不是像 Save If Save is successful Blah Else Blah End 所以我对“如果@user.save!”的理解是它既保存对象又如果成功则返回真/假。 如果我稍后调用它,例如: @user.save! if @user.save! blah end 我是否执行了两次保存查询? 回答1 我承认有一点不同,但仍然很重要。 这里的文档非常好: 节省! 随着保存! 验证始终运行。 如果它们中的任何一个失败 ActiveRecord::RecordInvalid 被引发。 保存(perform_validation=true) 如果 perform_validation 为真,则运行验证。 如果其中任何一个失败,则操作将被取消并且 save 返回 false。 如果标志为假,则完全绕过验证。 有关详细信息,请参阅 ActiveRecord::Validations。 所以, save! 不仅会返回 true 或 false,而且只会在成功时返回 true 并在失败时引发异常。 这种区分的目的是为了save! ,您可以使用标准的 ruby​​ 工具来捕获控制器中的错误,而save使您可以使用标准的 if 子句来执行相同的操作。
  • 面向对象的设计:保存复杂的对象(Object-oriented design: Saving complex objects)
    问题 我有一个复杂的域模型,它建立在一个遗留系统之上,该遗留系统为大多数“获取”方法构建了遗留系统-通常只是通过传递数据库主键ID来实现。 很简单。 我现在很好奇如何处理在数据库中创建新对象并用新数据保存现有对象的任务,并希望确保我涵盖了所有基础。 整个项目中与数据库中的实体相对应的主要域对象的数量在20-25之间。 大约需要保存10个左右(其余的仅用于保存数据,不需要用户进行更新)。 要保存的对象具有复杂的依赖性-对象A具有对象B的列表,其中包含对象C,D和E,例如,当原始对象A被保存时,可能需要保存所有这些对象。 我想对其进行构建,以使其易于被UI开发人员使用,但还强制要求仅保存有效数据(例如,除非对象C处于有效状态,否则对象B可能无法保存)。 这让我避开了让他们从头开始创建对象并尝试保存它的想法-我想遵循一个原则,即对象只能在有效状态下处于活动状态。 另一种选择是在处理它们的服务对象上公开“ CreateNew”和“ Save”方法,但是此类方法的参数列表会非常糟糕。 我正在考虑要求“ CreateNew”和“ Save”接受可以创建和传递的命令对象之类的东西,以便他们确切地知道需要什么数据以及他们无法尝试控制什么。 我阅读了命令模式,但不需要它提供的任何主要特权。 我应该基于什么考虑因素来决定采用哪种方法? 如果这完全是C#3.5,那就是C#3.5。 回答1
  • save(false) 和 save(:validate => false) 的区别(Difference between save(false) and save(:validate => false))
    问题 save(false)和save(:validate => false)什么区别? 据我所知,功能是相同的。 使用:validate的版本在 api 中,这让我相信save(false)是一个不推荐使用的版本? 在遵循以下内容时,我想到了这一点:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user。 该指南中有save(false) ,但我在使用它时遇到错误。 我将它切换到:validate版本,效果很好。 回答1 在 3 之前的 Rails 版本中, save是ActiveRecord::Base一个方法,您可以向它传递false以绕过验证。 在 Rails 3 中, save被移到ActiveRecord::Persistance ,从那时起你应该传递:validate => false来save以绕过验证。 回答2 当我们使用validate: false时,将跳过模型中的所有验证 @user = User.new(....) @user.save(validate: false) 操作库禁用验证 http://www.dan-manges.com/blog/action-dependent-validations-and-why-on-update-is-bad 跳过字段验证
  • 在Django中request.method ==“ POST”是什么意思?(What does request.method == “POST” mean in Django?)
    问题 我在我的观点中使用了很多东西,但是我想知道这到底是什么意思。 当我们编写request.method == "GET"或request.method == "POST"什么? 回答1 request.method == "POST"的结果是一个布尔值-如果来自用户的当前请求是使用HTTP“ POST”方法执行的,则为True ,否则为False (通常意味着HTTP“ GET”,但也有其他方法)。 您可以在Alasadir指向您的问题的答案中了解有关GET和POST之间差异的更多信息。 简而言之,POST请求通常用于表单提交-如果处理表单会更改服务器端状态(例如,在注册表单的情况下将用户添加到数据库),则POST请求是必需的。 GET用于普通的HTTP请求(例如,当您仅在浏览器中键入URL时)以及可以处理而没有任何副作用的表单(例如,搜索表单)。 该代码通常用于条件语句中,以区分用于处理已提交表单的代码和用于显示未绑定表单的代码: if request.method == "POST": # HTTP Method POST. That means the form was submitted by a user # and we can find her filled out answers using the request.POST QueryDict else: #
  • Django REST-Auth Password Reset
    I am completely confused by the django middleware available: I simply want to get password-reset (and later password-change) functionality running, using django with rest_auth on the backend and Vue on the frontend. Step 1: Requesting the Reset-Link via Mail Views So far I have made a CustomPasswordResetView: # project/accounts/views.py from rest_auth.views import PasswordResetView class CustomPasswordResetView(PasswordResetView): pass Serializers and a CustomPasswordResetSerializer: # project/accounts/serializers.py from rest_auth.serializers import PasswordResetSerializer class
  • Extjs 4.0.7,编辑器网格 - 如何获取更新的单元格值?(Extjs 4.0.7, Editor Grid - how to get updated cell value?)
    问题 我需要在控制器中获取(检索)更新的单元格值。 (MVC) 所以我尝试了这个, var modified = this.getItemGrid().getStore().getUpdatedRecords(); console.log(modified); // return [] empty array var modified = this.getItemList_Store().getUpdatedRecords(); console.log(modified); // return [] empty array 但即使我更新了一些单元格值,它也总是返回空数组。 有人知道我做错了什么吗? 这是我的部分视图代码, Ext.define("App.view.orders.ItemList_view", { extend: "Ext.grid.Panel", alias: "widget.itemList_view", plugins: [ Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ], initComponent: function () { this.store = "ItemList_store"; this.columns = [ { xtype: 'checkcolumn', text
  • 这个Mongoose独特的预保存验证在做错什么?(What am I doing wrong in this Mongoose unique pre-save validation?)
    问题 我正在尝试创建一个具有唯一用户名的用户模型。 这是它的代码: var mongoose = require("mongoose"); var Schema = mongoose.Schema; var UserSchema = new Schema({ username: String, password: String, }); UserSchema.virtual("password_confirmation").get(function() { return this.pw_conf; }).set(function(value) { this.pw_conf = value; }); UserSchema.path("username").required(true); UserSchema.path("password").required(true); UserSchema.pre("save",function(next, done) { var self = this; mongoose.models["User"].findOne({username : self.username},function(err, user) { if(user) { self.invalidate("user","username must be unique"); }
  • 将表单字段保存在组件参数joomla中(save form field in component params joomla)
    问题 我正在使用joomla 2.5,正在开发joomla的自定义组件。 我已经在后台管理页面中创建了表单。 我需要的是,我想将表单的发布数据保存在#_extensions数据库的该组件的params行中。 这是我的表/ component.php <?php defined('_JEXEC') or die('Restricted access'); jimport('joomla.database.table'); 类componentTablecomponent扩展了JTable { function __construct(&$db) { parent::__construct('#__extensions', 'extension_id', $db); } public function bind($array, $ignore = '') { if (isset($array['params']) && is_array($array['params'])) { // Convert the params field to a string. $parameter = new JRegistry; $parameter->loadArray($array['params']); $array['params'] = (string)$parameter; }