【问题标题】:Bootstrap datepicker default value simple_form_for引导日期选择器默认值 simple_form_for
【发布时间】:2013-05-04 12:27:16
【问题描述】:

我正在使用引导日期选择器来启用使用 simple_form_for 在表单中选择日期。例如

  <%= f.input :payment_date, as: :string, input_html: { class: "datepicker" } %>

我的日期选择器使用 dd-mm-yyyy 格式

我想使用 simple_form_for 将今天的日期设置为表单中的默认值,有什么想法可以做到这一点吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 simple-form


    【解决方案1】:
    <%= f.input :payment_date, as: :string, input_html: { class: "datepicker", value: Time.now.strftime('%d-%m-%Y') } %>   
    

    另一种格式是:(使用活动管理员 gem)

    f.input :date, as: :date_picker, :input_html => { :value => Date.today}
    

    【讨论】:

    • 我在使用 bootstrap-datetimepicker 时遇到了类似的问题,这也适用于日期和时间选择器。
    • 在 Rails 4 中 &lt;%= f.text_field :payment_date, as: :string, class: "datepicker", value: Date.today.strftime('%d/%m/%Y') %&gt;
    • @rAzOr 那帮助很大
    【解决方案2】:

    您也可以使用此 gem: https://github.com/Nerian/bootstrap-datepicker-rails

    在您的 gemfile.rb

    gem 'bootstrap-datepicker-rails'
    

    然后捆绑安装并重启 Rails 服务器

    然后将此行添加到 app/assets/stylesheets/application.css

     *= require bootstrap-datepicker
    

    并将这一行添加到 app/assets/javascripts/application.js

     //= require bootstrap-datepicker
    

    并在您的表单中使用它:

    <%= f.text_field :payment_date, :id => "datepicker", :value => Date.today %>
    

    并在表单的同一视图中添加此 javascript

    <script>
    $('#datepicker').datepicker({format: 'yyyy-mm-dd'});
    </script>
    

    【讨论】:

      【解决方案3】:

      我还需要让它工作并支持不使用以美国为中心的日期格式的多个区域设置,例如:日期格式为 dd/mm/yyyy 的 en-AU(澳大利亚)。

      问题

      Rails 期望浏览器的日期格式为 yyyy-mm-dd,但您希望在用户的区域设置中显示日期。虽然日期控件允许您指定显示格式,但它不允许您单独指定要发送回服务器的格式。

      解决方案

      构建一个隐藏的输入字段,将正确的格式发送回您的 Rails 服务器。我使用自定义 simple_form 输入控件执行此操作,该控件构建日期选择器输入字段和隐藏字段,并在输入控件更改时使用一些 javascript 转换为 rails 日期。

      结果是您可以在 rails 中拥有一个不错的引导日期选择器,并将其与 simple_form 一起使用,如下所示:

      <%= f.input :date, as: :bootstrap_datepicker %>
      

      或者使用长日期格式:

      <%= f.input :date, as: :bootstrap_datepicker, input_html: { format: :long } %>
      

      实施

      创建或编辑以下文件:

      宝石文件

      gem 'bootstrap-sass'
      gem 'bootstrap-datepicker-rails'
      

      config/locales/en-AU.yml

      en-AU:
        date:
          datepicker:
            default: "dd/mm/yyyy"
            long: "dd MM, yyyy"
          formats:
            default: ! '%d/%m/%Y'
            long: ! '%d %B, %Y'
      

      config/locales/en-US.yml

      en-US:
        date:
          datepicker:
            default: "mm/dd/yyyy"
            long: "MM dd, yyyy"
          formats:
            default: "dd/mm/yyyy"
            long: ! '%B %d, %Y'
      

      app/assets/stylesheets/application.css.scss

      @import "bootstrap-responsive";
      @import "bootstrap-datepicker";
      

      app/assets/javascripts/application.js.coffee

      #= require bootstrap
      #= require bootstrap-datepicker
      #= require bootstrap-datepicker-rails
      

      或者,app/assets/javascripts/application.js

      //= require bootstrap
      //= require bootstrap-datepicker
      //= require bootstrap-datepicker-rails
      

      app/assets/javascripts/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
      

      【讨论】:

        【解决方案4】:

        除了 Andrew Hacking 所说的之外:您的咖啡脚本还想要捕获 clearDate 事件。

        $ ->
          # convert bootstrap-datepicker value to rails date format (yyyy-mm-dd) on our hidden field
          $(document).on 'changeDate clearDate', '.bootstrap-datepicker', (evt) ->
            rails_date = if evt.date? then evt.date.getFullYear() + '-' + ('0' + (evt.date.getMonth() + 1)).slice(-2) + '-' + ('0' + evt.date.getDate()).slice(-2) else ''
            $(this).next("input[type=hidden]").val(rails_date)$(document).on 'changeDate clearDate', '.bootstrap-datepicker', (evt) ->`
        

        【讨论】:

          猜你喜欢
          • 2013-08-22
          • 2014-03-19
          • 1970-01-01
          • 2013-12-01
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          • 2017-01-18
          • 1970-01-01
          相关资源
          最近更新 更多