我在表单上使用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,三个标签,这是一团糟。 理想情况是在一行中有一个标签和三个字符串字段。
我是如何创建自定义输入的?
答案 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 -%>