表单中的更改不会保存到数据库中

Vit*_*aly 14 datepicker ruby-on-rails-3 simple-form twitter-bootstrap

我正在尝试在表单中添加日期字段.

我添加了bootstrap-datepicker-rails gem,所有需要的css和javascript.

当我在日历中选择日期并单击"保存"时,它不会在数据库中更新.

这是表单的代码:

= simple_form_for @model
  = f.input :date_last, :required => true, 
            :input_html => { data: {behaviour: "datepicker"}}, 
            :as => :string
  = f.button :submit, 'Save', :class => 'btn btn-primary'
Run Code Online (Sandbox Code Playgroud)

我认为这可能与格式有关,但不确定在哪里查看.

更新

当我将默认格式更改为yyyy-mm-dd(默认为mm/dd/yyyy)时,它可以正常工作:

$('[data-behaviour~=datepicker]').datepicker({"format": "yyyy-mm-dd", "weekStart": 1, "autoclose": true});
Run Code Online (Sandbox Code Playgroud)

And*_*ing 16

我刚才在这里回答了类似的问题,并在下面提供了我的答案:


我还需要使用它并支持多个不使用以美国为中心的日期格式的语言环境,例如:en-AU(澳大利亚),其日期格式为dd/mm/yyyy.

问题

Rails希望日期格式yyyy-mm-dd来自浏览器,但您希望在用户的语言环境中显示日期.虽然日期控件允许您指定显示格式,但它不允许您单独指定要发送回服务器的格式.

解决方案

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

结果是你可以在rails中有一个很好的bootstrap日期选择器,并使用simple_form,如下所示:

<%= f.input :date, as: :bootstrap_datepicker %>
Run Code Online (Sandbox Code Playgroud)

或者使用长日期格式:

<%= f.input :date, as: :bootstrap_datepicker, input_html: { format: :long } %>
Run Code Online (Sandbox Code Playgroud)

履行

创建或编辑以下文件:

的Gemfile

gem 'bootstrap-sass'
gem 'bootstrap-datepicker-rails'
Run Code Online (Sandbox Code Playgroud)

配置/区域设置/ EN-AU.yml

en-AU:
  date:
    datepicker:
      default: "dd/mm/yyyy"
      long: "dd MM, yyyy"
    formats:
      default: ! '%d/%m/%Y'
      long: ! '%d %B, %Y'
Run Code Online (Sandbox Code Playgroud)

配置/区域设置/ EN-US.yml

en-US:
  date:
    datepicker:
      default: "mm/dd/yyyy"
      long: "MM dd, yyyy"
    formats:
      default: "%m/%d/%Y"
      long: ! '%B %d, %Y'
Run Code Online (Sandbox Code Playgroud)

应用程序/资产/样式表/ application.css.scss

@import "bootstrap-responsive";
@import "bootstrap-datepicker";
Run Code Online (Sandbox Code Playgroud)

应用程序/资产/ JavaScript的/ application.js.coffee

#= require bootstrap
#= require bootstrap-datepicker
#= require bootstrap-datepicker-rails
Run Code Online (Sandbox Code Playgroud)

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

//= require bootstrap
//= require bootstrap-datepicker
//= require bootstrap-datepicker-rails
Run Code Online (Sandbox Code Playgroud)

应用程序/资产/ 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)
Run Code Online (Sandbox Code Playgroud)

应用程序/输入/ 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
Run Code Online (Sandbox Code Playgroud)


kor*_*ada 5

我遇到了类似的问题,在create action中转换格式为我解决了这个问题:

def create
     .....
     @person.dob = DateTime.strptime(params[:person][:dob], '%m/%d/%Y').to_date
     .....
     @person.save
     .....
end
Run Code Online (Sandbox Code Playgroud)