我知道这个问题被问了很多次,但我仍然觉得我错过了一些明显的东西。给定一个带有字段Address
的模型city
,我们希望使用默认值对其进行初始化,例如Awesome City
。
到目前为止我尝试过:
1)视图中的默认值:
# @file: /app/views/addresses/_form.html.erb
<dt><%= f.label :city %></dt>
<dd><%= f.text_field :city, :value => 'Awesome city' %></dd>
这有效,但感觉不对。此外,用户无法更改它,该值仍为Awesome city
。
2)覆盖city
方法:
# @file: app/models/address.rb
def city
self[:city] ||= 'Awesome city'
end
该字段呈现为空,因此由于某种原因它不起作用。如果您尝试Address.new.city
,则会获得默认值。
3)在控制器中分配默认值:
# address doesn't have a controller, we use nested forms
# belongs_to :parent
# @file: /app/controllers/parents_controller.rb
def new
@parent = Parent.new
@parent.build_address
@parent.address.city = 'Awesome city'
end
这实际上有效,但我认为它不应该在控制器中,而应该在模型中。
4)添加after_initialize
电话(是的,它有效,您不必覆盖回调):
# @file: app/models/address.rb
after_initialize :set_default_city
def set_default_city
self.city = 'Awesome city'
end
这也可以,但是每次实例化对象时都会调用它,这是我们不想要的。
5)JavaScript,这似乎是一种极端的衡量标准,它应该比这更容易。
底线:添加默认值的最佳方法是什么?每次我必须给一个字段一个默认值,似乎我正在努力做这么简单的事情。我还缺少其他选择吗?
编辑::我正在使用Rails 3.1.4和Ruby 1.8.7 / 1.9.2
答案 0 :(得分:4)
您可以在迁移文件中定义它:
class CreateAddress < ActiveRecord::Migration
def change
create_table :addresses do |t|
...
t.string :city, default: "Awesome City"
...
t.timestamps
end
end
end
其他选项是在控制器的new
操作中定义它,这样更灵活......因此,当您创建新的address
时,它将以默认值启动。 ...
def new
@address = Address.new
@address.city ||= "Awesome City"
...
end
编辑 - 在模型中定义默认值的可能解决方案:
before_save :set_default_city
def set_default_city
self.city ||= 'Awesome city'
end
答案 1 :(得分:2)
我的红宝石有点生锈,但有点像
Parent < ActiveRecord::Base
def self.custom_parent(options)
custom_parent = self.new
if options.empty?
custom_parent.update_attributes(default_options)
else
//Iterate over all options and assign them to custom_parent
end
return custom_parent
end
end
你必须创建“default_options”哈希
我认为这不会开箱即用,但我认为你有我的想法