更新:因此,我找到了this,显然这就是为什么这种旧的工作方式无法正常工作的原因,ActiveAdmin必须使用Formtastic2.x。按照指示,我现在在app/inputs/date_picker_input.rb中创建了一个文件,如下所示:

class DatePickerInput
  include Formtastic::Inputs::Base

  def to_html
    puts "this is my datepickerinput"
  end
end


我的控制器现在看起来像这样:

  f.input :open_date, :as => :date_picker
  f.input :close_date, :as => :date_picker


但是现在我遇到了这个错误:

ActionView::Template::Error (undefined method 'html_safe' for nil:NilClass): 1: render renderer_for(:edit)

有什么想法吗?

我在尝试渲染:as => string时遇到Formtastic自动将日期格式化为我不想要的格式(Y-m-d h:i:s Z)的问题,因此可以在字段上使用日期选择器。为了解决这个问题,我遇到了this solution

这似乎很有意义,并且与我正在处理的问题完全相同。但是,我似乎无法实现此修复程序,我想知道是否是因为通过ActiveAdmin使用了Formtastic。因此,这是我尝试做的事情:

在控制器中,我将方法更改为:

f.input :open_date, :as => :date

我也尝试过此方法,尽管我的问题甚至无法到达这一点:

f.input :open_date, :as => :date_input

我在lib/datebuilder.rb处使用以下代码创建了一个文件:

class DateBuilder < Formtastic::SemanticFormBuilder
  def date_input(method, options)
    current_value = @object.send(method)
    html_options ||= {:value =>  current_value ? I18n.l (current_value) : @object.send("#{method}_before_type_cast")}
    self.label(method, options.delete(:label), options.slice (:required)) +
    self.send(:text_field, method, html_options)
  end
end


我不确定这是否会按照我的意愿修复格式,但是我假设如果我可以让Formtastic使用此方法,则可以根据需要进行更改(当前是从上面链接中提到的解决方案中获取的)。

This article提到您需要在格式化初始化器中添加一行以使用此自定义输入:

Formtastic::SemanticFormHelper.builder = Formtastic::DateBuilder

我在config/initializers中没有此初始化程序文件,因此我在上面的行中添加了它(config/initializers/formtastic.rb)。我现在遇到的问题是尝试启动Rails应用程序时出现此错误:

../config/initializers/formtastic.rb:1:in '<top (required)>': uninitialized constant Formtastic::SemanticFormHelper (NameError)

我也在该文件中尝试了这种语法:

module Formtastic
  module SemanticFormHelper
    self.builder = DateBuilder
  end
end


这给了我这个错误:../config/initializers/formtastic.rb:3:in '<module:SemanticFormHelper>': uninitialized constant Formtastic::SemanticFormHelper::DateBuilder (NameError)

如果我要以完全错误的方式进行操作,请告诉我,否则,让Formtastic使用此自定义输入类型的任何帮助都将是惊人的!

最佳答案

好了,终于找到了执行此操作的正确方法。

我的控制器与更新中的相同。但是,这是我将DatePicker自定义输入文件(app/inputs/date_picker_input.rb)更改为以下内容的方式:

class DatePickerInput < Formtastic::Inputs::StringInput
  def to_html
    "<li class='string input required stringish' id='question_#{method.to_s}_input'>" +
    "<label class=' label' for='question_#{method.to_s}'>#{method.to_s.gsub!(/_/, ' ').titleize}*</label>" +
    "<input id='question_#{method.to_s}' name='question[#{method.to_s}]' type='text' value='#{object.send(method)}' class='hasDatePicker'>" +
"</li>"
  end
end


希望这可以帮助其他人遇到同样的问题!顺便说一句,硬编码的“问题”和“必需”是因为我将仅在问题对象上使用此自定义输入。可能有一种动态获取此信息的方法,但我决定不进行更多工作来弄清楚(这本身就很头疼!)

10-07 12:25