我知道这个问题已经被问了无数次,但我仍然觉得我错过了一些明显的东西。给定一个模型,其中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