Rails字符串在创建时不允许DB中的空字符串值

时间:2014-12-05 19:39:35

标签: ruby-on-rails postgresql

我的schema.rb中有一个看起来像这样的模型

create_table "runs", force: true do |t|
    ...
    t.string   "label", default: "Default Run Title", null: false
    ...
    t.datetime "timestamp"
end

但是,当我创建一个新的运行时,在表单中将标签字段留空,它会将运行存储为:

=> #<Run... label: "", .....>

如果字符串作为空字符串传递,我想强制将默认值设置为default: "Default Run Title

我错过了什么?

我想我可以使用验证器方法或者before_save或者其他东西,但我宁愿让模型控制这种行为,因为这完全属于default =>应该做的事情。

1 个答案:

答案 0 :(得分:3)

在你的数据库模式中放置这样的垃圾确实非常烦人。如果以后你需要改变那个措辞怎么办?然后,您需要运行迁移。如果您希望根据用户的语言更改短语,该怎么办?然后你需要写一个黑客来解决它。

将这个放在你的模型中会更好:

before_validation :assign_default_label

然后有一个默认方法:

def assign_default_label
  return if (self.label?)

  self.label = "Default Run Title"
end

每当您需要更改该措辞时,您只需重新部署而无需更改架构。

如果分配的标题包含空格以外的其他内容,则模型中的label?方法将返回true。这意味着空白标题将替换为您想要的任何措辞。这些方法由ActiveRecord自动生成。