加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在text_field中设置默认值?

发布时间:2020-12-17 03:03:08 所属栏目:百科 来源:网络整理
导读:我知道这个问题被问了很多次,但我仍然觉得我错过了一些明显的东西.给定一个带有字段城市的模型地址,我们希望用默认值初始化,比如Awesome City. 到目前为止我尝试过的: 1)视图中的默认值: # @file: /app/views/addresses/_form.html.erbdt%= f.label :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>

这有效,但感觉不对.用户也无法改变它,价值仍将是令人敬畏的城市.

2)覆盖城市方法:

# @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

解决方法

您可以在迁移文件中定义它:

class CreateAddress < ActiveRecord::Migration
  def change
    create_table :addresses do |t|
      ...
      t.string :city,default: "Awesome City"
      ...

      t.timestamps
    end
  end
end

其他选项是在您的控制器中的新操作中定义它,这更灵活…因此,当您创建新地址时,它将以默认值启动….

def new
   @address = Address.new
   @address.city ||= "Awesome City"
   ...
 end

编辑 – 在模型中定义默认值的可能解决方案:

before_save :set_default_city
def set_default_city
   self.city ||= 'Awesome city'
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读