我的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 =>
应该做的事情。
答案 0 :(得分:3)
在你的数据库模式中放置这样的垃圾确实非常烦人。如果以后你需要改变那个措辞怎么办?然后,您需要运行迁移。如果您希望根据用户的语言更改短语,该怎么办?然后你需要写一个黑客来解决它。
将这个放在你的模型中会更好:
before_validation :assign_default_label
然后有一个默认方法:
def assign_default_label
return if (self.label?)
self.label = "Default Run Title"
end
每当您需要更改该措辞时,您只需重新部署而无需更改架构。
如果分配的标题包含空格以外的其他内容,则模型中的label?
方法将返回true。这意味着空白标题将替换为您想要的任何措辞。这些方法由ActiveRecord自动生成。