如何在text_field中设置默认值?

时间:2012-06-27 10:05:27

标签: ruby-on-rails ruby-on-rails-3.1

我知道这个问题被问了很多次,但我仍然觉得我错过了一些明显的东西。给定一个带有字段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

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”哈希

我认为这不会开箱即用,但我认为你有我的想法