2013-03-14 52 views
14

我正在嘗試向我的窗體添加日期字段。窗體中的更改不會保存到數據庫

我添加了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' 

我認爲這可能與格式做,但不知道在哪裏看。

更新

當我改變默認格式YYYY-MM-DD(默認爲MM/DD/YYYY)它的工作原理:

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

回答

5

我遇到過類似的問題,轉換格式,創建行動解決了這個問題對我來說:

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

我剛纔已經回答了類似的問題here,並已列入我的回答如下:


我還需要得到這個工作,並支持不使用以美國爲中心的日期格式多個區域設置,如:EN-AU(澳大利亞),其中有日期格式DD/MM/YYYY。

的問題

Rails的預計日期格式是從瀏覽器yyyy-mm-dd,但要顯示在用戶的語言環境的日期。雖然日期控件允許您指定顯示格式,但它不允許您單獨指定要發送回服務器的格式。

解決方案

構建發送正確的格式返回給你的Rails服務器隱藏的輸入字段。我使用自定義的simple_form輸入控件執行此操作,該控件構建日期選擇器輸入字段和隱藏字段,並在輸入控件更改時使用一些javascript轉換爲導航日期。

的結果是,你可以在導軌一個很好的引導日期選擇器,並與simple_form使用如下:

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

或者使用長日期格式:

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

實現

創建或編輯以下文件:

的Gemfile

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

配置/區域設置/ EN-AU。陽明海運

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

配置/區域設置/ EN-US.yml

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

應用程序/資產/樣式表/ application.css.scss

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

應用程序/ assets/javascripts/application.js.coffee

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

或者,應用程序/資產/ Javascript角/ application.js中

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

應用程序/資產/ 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 
+0

真棒答案的形式,感謝的是,只是指出出的是,在區域設置的日期格式應該如下: ''' 日期: 日期選擇器: 缺省: 「%米/%d /%Y」 長: 「%B%d,%Y」 格式: 默認:「%m /%d /%Y」 長:! '%B%d,%Y' ''' 請參閱http://apidock.com/ruby/DateTime/strftime – X2theZ 2014-01-21 21:12:02

+0

謝謝,編輯了答案以反映正確的格式字符串 – 2014-01-28 01:06:57

0

安德魯黑客的答案對我很好,對app/inputs/bootstrap_datepicker_input.rb進行了兩處小改動。我使用的是Rails 4.2.0。它忽略隱藏字段中的值作爲重複項(因爲文本輸入和隱藏輸入具有相同的「名稱」屬性)。我切換:

"#{@builder.text_field(attribute_name, text_field_options.to_hash)}\n" 

...這樣的:

"#{@builder.text_field(attribute_name.to_s+'_box',text_field_options.to_hash)}\n" + 

而且,我失去的包裝選項,所以我加了一個參數input和合並的包裝選項加入到HTML選項。

此:

def input 
    text_field_options = input_html_options.with_indifferent_access 
    ... 

...變成了:

def input(wrapper_options) 
    merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) 
    text_field_options = merged_input_options.with_indifferent_access 
    ... 
0

從來就使用從安德魯的anwser。它對我很好,除了它沒有顯示本地化的月份名稱正確(例如7月而不是Juli)。

這是我的方法,如果你想爲你的date_picker使用本地化的版本。

默認情況下,bootsrap-datepicker gem加載所有語言版本。

如果你想例如只加載英文和德文版本,你必須更改應用程序。從

//= require bootstrap-datepicker 

//= require bootstrap-datepicker/core 
//= require bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.js 
//= require bootstrap-datepicker/locales/bootstrap-datepicker.de.js 

接下來的步驟JS

是改變BootstrapDatepickerInput

我們現在需要的就是語言的動態從給定choosen參數。

所以下面的行添加到您輸入類輸入法

set_data_option text_field_options, 'date-language', input_html_options[:locale] 

內我們認爲,我們現在可以調用與

= f.input :your_attribute_name, as: :bootstrap_datepicker, input_html: { locale: locale } 
相關問題