【问题标题】:Handle date in simpleform with activemodel in rails使用 rails 中的 activemodel 以简单形式处理日期
【发布时间】:2016-12-15 08:04:10
【问题描述】:

我的模型中有一个 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)=' 

当我试图在我的控制器中启动模型时。

@promotion_codes_generator = PromotionCodesGenerator.new(promotion_codes_generator_params)

那么我应该如何正确处理日期呢?

【问题讨论】:

  • 不要使用日期助手。使用 javascript datepickers 和一个简单的文本输入。
  • 如果这些解决方案中的任何一个对您有用,请选择一个答案。

标签: ruby-on-rails ruby date activemodel


【解决方案1】:

尝试将as: :date 替换为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 %>

【讨论】:

    【解决方案2】:

    您可以使用名为 multiparameter_attributes_handler 的 gem。如果将其应用于params,它将为end_datestart_date 创建条目,其中包含从表单元素提交构造的日期对象。这将允许您保留 rails helper 日期表单下拉菜单。

    【讨论】:

      【解决方案3】:

      我将 JQuery 日期选择器与简单的表单自定义输入结合使用。如果您想显示美国格式化时间 (mm/dd/yyyy),但通过 alt_field 提交 rails 格式 (yyyy-mm-dd) 的字段,这样做特别有用。如果你想这样做,首先确保你已经安装了 jquery-rails gem。

      在 app/inputs/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 日期选择器初始化中用于指定隐藏字段。

      在您的表单中,只需将“as::date”更改为“as::datepicker”:

      <%= 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")
      });
      

      格式为“yy-mm-dd”的 altField 将代替显示的“mm/dd/yy”字段提交。在您的控制器中,您只需像您已经做的那样允许您在对象内部使用参数 start_date 和 end_date。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多