Изменение ввода даты simple_form, чтобы иметь три строковых ввода вместо трех выпадающих меню - PullRequest
2 голосов
/ 20 декабря 2011

Я использую в форме gem simple_form и хочу использовать поля даты с тремя полями 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 ]

2 голосов
/ 16 января 2012

С помощью списка рассылки 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 голос
/ 05 января 2012

Если вы ищете пользовательские входы в readme SimpleForm Я полагаю, что вы можете написать пользовательский ввод, как например ..

# 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 -%>
...