po prostu odpowiedział na podobne pytanie here i obejmowały moją odpowiedź poniżej:
Musiałem także uzyskać tej pracy i wspierać wiele języków, które nie korzystają US centric formaty dat, np: en-AU (Australia), który ma format daty dd/mm/rrrr.
problem
Rails spodziewa format daty, aby być yyyy-mm-dd
z przeglądarki, ale chcesz wyświetlić datę w lokalizacji użytkownika. Podczas gdy kontrola daty pozwala ci określić format wyświetlania, NIE pozwala ci osobno określać formatu, który ma być odesłany do serwera.
Rozwiązanie
Zbuduj pole wejściowe ukryte który wysyła odpowiedni format z powrotem do serwera szyn. Robię to za pomocą niestandardowego formantu wejściowego simple_form, który buduje zarówno pole wejściowe do wyboru daty, jak i ukryte pole, i używa niektórych javascript do konwersji na datę rails, kiedy zmienia się kontrola wprowadzania.
Skutek jest taki, można mieć ładny bootstrap Date-próbnik w szynach i używać go z simple_form następująco:
<%= f.input :date, as: :bootstrap_datepicker %>
Albo użyć długiego formatu daty:
<%= f.input :date, as: :bootstrap_datepicker, input_html: { format: :long } %>
Wdrożenie
Utwórz lub edytuj następujące pliki:
Gemfile
gem 'bootstrap-sass'
gem 'bootstrap-datepicker-rails'
config/locales/pl-UA.yml
en-AU:
date:
datepicker:
default: "dd/mm/yyyy"
long: "dd MM, yyyy"
formats:
default: ! '%d/%m/%Y'
long: ! '%d %B, %Y'
config/locales/pl-US.yml
en-US:
date:
datepicker:
default: "mm/dd/yyyy"
long: "MM dd, yyyy"
formats:
default: "%m/%d/%Y"
long: ! '%B %d, %Y'
app/assets/stylów/application.css.scss
@import "bootstrap-responsive";
@import "bootstrap-datepicker";
app/assets/javascripts/application.js.coffee
#= require bootstrap
#= require bootstrap-datepicker
#= require bootstrap-datepicker-rails
Alternatywnie APP/obrotowe/JavaScript/application.js
//= require bootstrap
//= require bootstrap-datepicker
//= require bootstrap-datepicker-rails
APP/obrotowe/JavaScript/bootstrap-datepicker-rails.js.coffee
$ ->
# convert bootstrap-datepicker value to rails date format (yyyy-mm-dd) on our hidden field
$(document).on 'changeDate', '.bootstrap-datepicker', (evt) ->
rails_date = evt.date.getFullYear() + '-' + ('0' + (evt.date.getMonth() + 1)).slice(-2) + '-' + ('0' + evt.date.getDate()).slice(-2)
$(this).next("input[type=hidden]").val(rails_date)
app/inputs/bootstrap_datepicker_input.rb
class BootstrapDatepickerInput < SimpleForm::Inputs::Base
def input
text_field_options = input_html_options.with_indifferent_access
format = text_field_options.delete(:format)
hidden_field_options = text_field_options.dup
hidden_field_options[:class] = text_field_options[:class].dup # so they won't work with same array object
hidden_field_options[:id] = "#{attribute_name}_hidden"
text_field_options[:class] << 'bootstrap-datepicker'
text_field_options[:type] = 'text'
text_field_options[:value] ||= format_date(value(object), format)
set_data_option text_field_options, 'date-format', I18n.t(format, scope: [:date, :datepicker], default: :default)
default_data_option text_field_options, 'provide', 'datepicker'
return_string =
"#{@builder.text_field(attribute_name, text_field_options.to_hash)}\n" +
"#{@builder.hidden_field(attribute_name, hidden_field_options.to_hash)}\n"
return return_string.html_safe
end
protected
def default_data_option(hash, key, value)
set_data_option(hash,key,value) unless data_option(hash, key)
end
def data_option(hash, key)
hash[:data].try(:[],key) || hash["data-#{key}"]
end
def set_data_option(hash, key, value)
hash[:data].try(:[]=,key,value) || (hash["data-#{key}"] = value)
end
def value(object)
object.send @attribute_name if object
end
def format_date(value, format=nil)
value.try(:strftime, I18n.t(format, scope: [ :date, :formats ], default: :default))
end
end
Niesamowite odpowiedź, dziękuję za to, po prostu wskazując się, że format daty w lokalizacji powinna być następująca: '' ' data: datepicker: default: "% m /% d /% Y" długo: "% B% d,% Y" formaty: domyślnie: "% m /% d /% Y" long:! "% B% d,% Y" '' ' Zobacz http://apidock.com/ruby/DateTime/strftime – X2theZ
Dzięki, zredagowaliśmy odpowiedź, aby odzwierciedlić poprawny ciąg znaków –