【问题标题】:allow_nil: false does not work from rails consoleallow_nil: false 在 Rails 控制台中不起作用
【发布时间】:2014-05-24 18:21:25
【问题描述】:

这里是新手,试图在 ruby​​ on rails 表单中添加一些规则,特别是如果它没有名称,我不想允许创建项目

class Idea < ActiveRecord::Base
mount_uploader :picture, PictureUploader
belongs_to :project
validates :name, presence: true, allow_nil: false
end

如果我从我的应用程序创建一个新项目,工作顺利,但如果我从 Rails 控制台创建一个项目,情况就不一样了。无论是在应用程序中还是在 Rails 控制台中创建的,如何避免创建没有名称的项目?

【问题讨论】:

  • 你是如何从控制台创建的?向我们展示代码。
  • wrwer = Idea.new > Idea.save
  • 仍然允许我创建没有名字的新想法。
  • 我迷路了,为什么要设置allow_nil或allow_blank?它是存在验证器,默认情况下不允许空白值。
  • 您是否在控制台中运行过reload!

标签: ruby-on-rails activerecord


【解决方案1】:

问题是你必须设置allow_blank: false 而不是allow_nil: false

在 Ruby 中,empty stringnot nil

"".nil?
#=> false

"".blank?
#=> true

像这样更新你的模型

class Idea < ActiveRecord::Base
  mount_uploader :picture, PictureUploader
  belongs_to :project
  validates :name, presence: true, allow_blank: false
end

如果您想了解nilblank 之间的区别,请参阅此SO 帖子。

参考这些 Guides 以获得allow_blank

【讨论】:

  • 我强烈建议使用allow_blank 而不是allow_nil 就像这个答案所说的那样。但也可以考虑使用nilify_blanks gem 来确保在数据库中存储NULLs 而不是空字符串以获取空值。
  • @malditojavi 很高兴为您提供帮助!请接受我的回答:)
【解决方案2】:

从控制台试试这个:-

Idea.create(:name => "Something")

Rails 控制台输出:-

1.9.3-p385 :005 > c  = CabinNumber.create(:name => "Something")
(0.2ms)  begin transaction
SQL (1.1ms)  INSERT INTO "cabin_numbers" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sun, 25 May 2014 00:02:04 IST +05:30], ["name", "Something"], ["status", false], ["updated_at", Sun, 25 May 2014 00:02:04 IST +05:30]]
(139.6ms)  commit transaction
=> #<CabinNumber id: 11, name: "Something", status: false, created_at: "2014-05-24 18:32:04", updated_at: "2014-05-24 18:32:04"> 

idea = Idea.new(:name => "hello")
idea.save

Rails 控制台输出:-

1.9.3-p385 :007 > c  = CabinNumber.new(:name => "hello")
=> #<CabinNumber id: nil, name: "hello", status: false, created_at: nil, updated_at: nil> 
1.9.3-p385 :008 > c.save
(0.1ms)  begin transaction
SQL (1.0ms)  INSERT INTO "cabin_numbers" ("created_at", "name", "status", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sun, 25 May 2014 00:02:57 IST +05:30], ["name", "hello"], ["status", false], ["updated_at", Sun, 25 May 2014 00:02:57 IST +05:30]]
(155.0ms)  commit transaction
=> true 

如果没有提供名称字段,则无法创建

1.9.3-p385 :003 > c  = CabinNumber.create()
(0.2ms)  begin transaction
(0.1ms)  rollback transaction
=> #<CabinNumber id: nil, name: nil, status: false, created_at: nil, updated_at: nil> 

【讨论】:

  • 仍然允许我创建没有名字的新想法。
    #
  • 您的两个解决方案都在“名称”字段中包含一个文本字符串,如果我包含 allow_nil: false,rails 控制台不应允许我创建没有名称的新项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2015-10-16
  • 2013-01-06
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多