2016-12-15 121 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对象就像你已经做的那样。