将simple_form日期输入更改为具有三个字符串输入而不是三个下拉菜单

时间:2011-12-20 17:43:06

标签: datepicker simple-form

我在表单上使用simple_form gem,并希望使用包含三个text_fields字段而不是三个选择字段的日期字段。

我试过了:

<%= profile_form.simple_fields_for :birthday do |date| %>
  <%= date.input :day, :as => :string, :label => "Dia", :input_html => { :maxlength => 2 } %>
  <%= date.input :month, :as => :string, :label => "Mês", :input_html => { :maxlength => 2 } %>
  <%= date.input :year, :as => :string, :label => "Ano", :input_html => { :maxlength => 4 } %>
<%- end -%>

但这会产生三个div,三个标签,这是一团糟。 理想情况是在一行中有一个标签和三个字符串字段。

我是如何创建自定义输入的?

2 个答案:

答案 0 :(得分:2)

在simple_form的邮件列表的帮助下,我终于得到了它。 自定义输入如下所示:

class CustomDateInput < SimpleForm::Inputs::Base
   def input
    "#{@builder.text_field("day", input_html_options)}".html_safe +
    "#{@builder.text_field("month", input_html_options)}".html_safe +
    "#{@builder.text_field("year", input_html_options)}".html_safe
  end

  #Makes the label target the day input
  def label_target
    "day"
  end
end

日,月和年是需要创建的虚拟属性。 我已将它们添加到模块中,以便它们可以在我的模型中混合使用。 该模块如下所示:

module Extensions
  module DateFields

    attr_accessor :day, :month, :year

    def fulldate
      Date.parse("#{@day}-#{@month}-#{@year}")
    end
  end
end

现在在我的模特中,我可以这样做:

class Profile < ActiveRecord::Base
  belongs_to :user
  before_save :update_birthday

  include Extensions::DateFields

  private
  def update_birthday
    unless fulldate == true || nil?
      self.birthday=fulldate
    end
  end

end

答案 1 :(得分:1)

如果您在SimpleForm's readme上搜索自定义输入,我相信您可以编写这样的自定义输入..

# app/inputs/inline_input.rb
class InlineInput < SimpleForm::Inputs::Base
  def input
    "<span>#{@builder.text_field(attribute_name, input_html_options)}</span>".html_safe
  end
end

然后像这样称呼它

<%=profile_form.simple_fields_for :birthday do |date| %>
  <%= date.input :day, :as => :inline, :label => false, :input_html => { :maxlength => 2 } %>
  <%= date.input :month, :as => :inline, :label => false, :input_html => { :maxlength => 2 } %>
  <%= date.input :year, :as => :inline, :label => false, :input_html => { :maxlength => 4 } %>
<%- end -%>