2016-12-15 129 views
2

我有一個加載ActiveModel在我的模型如下圖所示:手柄日期與在軌activemodel的

class PromotionCodesGenerator 
    include ActiveModel::Model 
    include ActiveModel::Validations 

    attr_accessor :no_of_codes,:start_date,:end_date 
end 

而像下面

<%= simple_nested_form_for ([:admin, @promotion_codes_generator]) do |f| %> 
     <%= f.input :start_date, as: :date, default: Time.zone.now, wrapper_tag: :p %> 
     <%= f.input :end_date, as: :date, default: Time.zone.now + 1.month, wrapper_tag: :p %> 
<% end %> 

當表單提交帕拉姆看起來像這樣的觀點

{"no_of_codes"=>"12", "start_date(1i)"=>"2016", "start_date(2i)"=>"12", "start_date(3i)"=>"15", "end_date(1i)"=>"2017", "end_date(2i)"=>"1", "end_date(3i)"=>"15"} 

當然,這給了我錯誤

undefined method `start_date(1i)=' 

當im試圖在我的控制器中啓動模型。

@promotion_codes_generator = PromotionCodesGenerator.new(promotion_codes_generator_params) 

那麼我該如何正確處理日期呢?

+1

請勿使用日期助手。去與JavaScript日期選擇器和一個簡單的文本輸入。 – jvnill

+2

http://stackoverflow.com/questions/22798691/how-to-handle-date-fields-in-a-non-model-rails-form – Pavan

+0

如果任何這些解決方案爲您工作,請選擇一個答案。 – jlesse

回答

0

嘗試as: :string

<%= f.input :start_date, as: :string, default: Time.zone.now, wrapper_tag: :p %> 
<%= f.input :end_date, as: :string, default: Time.zone.now + 1.month, wrapper_tag: :p %> 
0

更換as: :date您可以使用寶石稱爲multiparameter_attributes_handler。如果將其應用於params,它將創建條目end_datestart_date,其中包含從表單元素提交構建的日期對象。這將允許你保持助手日期形式下拉菜單。

0

我將JQuery日期選取器與簡單表單自定義輸入結合使用。如果要顯示美國格式化時間(mm/dd/yyyy),則以這種方式進行此操作會非常有用,但通過alt_field以rails格式(yyyy-mm-dd)提交字段。如果你想這樣做,首先確保安裝了jquery-rails gem。

創建在app /輸入/ datepicker_input.rb日期自定義簡單的形式輸入:

class DatepickerInput < SimpleForm::Inputs::StringInput 
    def input(wrapper_options) 
     merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) 
     class_name = object.class.name.underscore + "_" 
     "#{@builder.text_field(attribute_name, merged_input_options)}".html_safe + 
     "#{@builder.hidden_field(attribute_name, { id: class_name + attribute_name.to_s + '-alt'}) }".html_safe 
    end 
end 

此自定義輸入創建一個文本字段以顯示格式的日期給用戶,和一個隱藏的字段是代替顯示的文本字段提交。隱藏字段是給定的,並且class_name + attribute_name + -alt的id。此ID將用於JQuery日期選取器初始化中指定隱藏字段。

在您的形式簡單地改變 「爲:日期」 到 「爲:日期選擇器」:

<%= simple_nested_form_for ([:admin, @promotion_codes_generator]) do |f| %> 
     <%= f.input :start_date, as: :datepicker, default: Time.zone.now, wrapper_tag: :p %> 
     <%= f.input :end_date, as: :datepicker, default: Time.zone.now + 1.month, wrapper_tag: :p %> 
<% end %> 

在你的JavaScript:

$("#admin_start_date").datepicker({ 
    dateFormat: "mm/dd/yy", 
    altFormat: "yy-mm-dd", 
    altField: $("#admin_start_date-alt") 
}); 

$("#admin_end_date").datepicker({ 
    dateFormat: "mm/dd/yy", 
    altFormat: "yy-mm-dd", 
    altField: $("#admin_end_date-alt") 
}); 

的altField與「YY-的格式mm-dd「將被提交以代替顯示的」mm/dd/yy「字段。在你的控制器中,只要允許你在你的對象內的params start_date和end_date對象就像你已經做的那樣。