如何设置simple_form输入默认值

时间:2015-07-09 06:26:23

标签: ruby-on-rails simple-form

= r.input :date_start do
  = r.text_field :date_start, id: 'date_start'

如何为此设置默认值?

5 个答案:

答案 0 :(得分:2)

= r.input :date_start, as: :string, input_html: {value: '01/01/2015', id: 'date_start'}

答案 1 :(得分:1)

使用此代码:

= r.input :date_start, as: :string, input_html: {id: 'date_start',value: '07/02/2015'}

答案 2 :(得分:0)

使用安全导航或此Answer中对另一个问题进行了解释的&.是这里的一种选择;尤其是与||运算符链接时。

AnswerKiry Meas

注意:我使用的是Time.now而不是Time.new,因为我觉得它更具可读性,并且更好地传达了默认值的意图。如果您想查看现在或新的对话或基准,我建议您使用Question。在本Answer中,还有一个很好的解释说明为什么您可能想使用Time.current

input_html: { value: (f.object.date_start.present?) ? f.object.date_start : Time.now }

与这个Answer相同,只是一个重复的问题,没有说明,以上内容可以重写为:

input_html: { value: f.object&.date_start || Time.now }

如果存在,则提供现有值,如果不存在,则提供nil。与||运算符配对时,逻辑将寻找第一个“真实”响应。 nil不被认为是“真实的”,||将选择nilTime.now的默认值。

最后,我觉得这很容易理解,并且为简单表单输入设置默认值的答案也较少。

 = f.input :date_start, input_html: { value: f.object&.date_start || Time.now }

我重构Kiry's Answer的另一个原因是,因为我认为在这种情况下使用三元数正接近违反Tell, Don't Ask的原理,如示例4中Tell, Don't Ask: refactoring examples所述。 / p>

上面直接回答了这个问题,下面建议进行重构

Gavit的回答的解释是为记录的保存设置迁移的默认值:

# migration
class AddDefaultToDateStartOfObj < ActiveRecord::Migration[5.2]
  def change
    change_column :objs, :date_start, -> { 'CURRENT_TIMESTAMP' }
  end
end

# simple_form input
= f.input :date_start

注意:根据您的数据库类型,SQL可能会有所不同,但是关于此迁移的细微差别,这里是一个不错的Question

但是,当对象是新对象而不是数据库中的记录时,这将不起作用。

我建议迁移并在对象模型中构建一个方法来处理输入的默认值,同时遵循更好的编码原则,这样可以使代码更干净/更具可读性。

 # simple_form input
 = f.input :date_start, input_html: { value: f.object.date_start_with_default }

 # Model with date_start attribute
 class Obj
   def date_start_with_default
     # based on your model, like in Kiry's comment to their own answer, you may need this instead:
     # try(:date_start) || Time.now 
     date_start || Time.now 
   end
 end

现在,可以通过模型在单个位置控制/更新默认值的所有逻辑。

答案 3 :(得分:-1)

在数据库中指定它: t.date:date_start,:null =&gt; false,:default =&gt; '现在()'

答案 4 :(得分:-1)

试试这个:

= f.input :date_start, input_html: { value: (f.object.date_start.present?) ? f.object.date_start : Time.new }