Rails模型.model.valid?返回假却返回true。

huangapple go评论95阅读模式
英文:

Rails model.valid? return falsely returning true

问题

模型验证失败 with_context

模型

  1. class Course < ApplicationRecord
  2. with_options on: :basic_info_steps do
  3. validates :name, presence: true
  4. end
  5. end

控制器

  1. def create
  2. @user = current_user
  3. @course = Course.new(session[:course_attributes])
  4. @course.assign_attributes(course_params)
  5. if @course.valid?(context: :basic_info_steps)
  6. session[:course_attributes].merge!(@course.attributes)
  7. redirect_to [:new, :courses, :details_info_steps]
  8. else
  9. render :new, status: :unprocessable_entity
  10. end
  11. end

@course = Course.new(session[:course_attributes])
=> #<Course id: nil, name: "", actived: true...

名称为空但

@course.valid?(context: :basic_info_steps)
=> true

@course.save(context: :basic_info_steps)
=> false

英文:

The model validation fail with_context

model

  1. class Course &lt; ApplicationRecord
  2. with_options on: :basic_info_steps do
  3. validates :name, presence: true
  4. end
  5. end

controller

  1. def create
  2. @user = current_user
  3. @course = Course.new(session[:course_attributes])
  4. @course.assign_attributes(course_params)
  5. if @course.valid?(context: :basic_info_steps)
  6. session[:course_attributes].merge!(@course.attributes)
  7. redirect_to [:new, :courses, :details_info_steps]
  8. else
  9. render :new, status: :unprocessable_entity
  10. end
  11. end

>> @course = Course.new(session[:course_attributes])
=> #<Course id: nil, name: "", actived: true......

Name is empty but

>> @course.valid?(context: :basic_info_steps)
=> true

>> @course.save(context: :basic_info_steps)
=> false

答案1

得分: 1

惊讶的是,对于设置 valid?save 方法的上下文,语法是不同的,因此这样可以工作:

  1. class Course &lt; ApplicationRecord
  2. validates :name, presence: true, on: :basic_info_steps
  3. end
  4. course = Course.new(name: &quot;&quot;)
  5. course.valid?(:basic_info_steps) #=&gt; false
  6. course.save(context: :basic_info_steps) #=&gt; false
  7. #但是:
  8. course.valid?(context: :basic_info_steps) #=&gt; true,很奇怪吧?
英文:

surprisingly the syntax is different for setting the context for the valid? and save methods*, so this works:

  1. class Course &lt; ApplicationRecord
  2. validates :name, presence: true, on: :basic_info_steps
  3. end
  4. course = Course.new(name: &quot;&quot;)
  5. course.valid?(:basic_info_steps) #=&gt; false
  6. course.save(context: :basic_info_steps) #=&gt; false
  7. #but:
  8. course.valid?(context: :basic_info_steps) #=&gt; true, weird huh?

* see rails guides

huangapple
  • 本文由 发表于 2023年5月28日 05:07:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/76349045.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定