Rails - 简单形式 - Cocoon gem - 日期选择器在编辑中工作,但不在创建中

时间:2016-11-06 23:45:16

标签: ruby-on-rails ruby datepicker simple-form nested-forms

我正在使用带有简单形状和茧宝石的rails 5.

我的模特叫Tenor。

次要表单字段嵌套在父模型中。中学模型中的属性是:

<div class="nested-fields">
    <div class="form-inputs">
        <div class="row">
          <div class="col-md-4">
            <%= f.input :express_interest, :as => :date_picker, :label => 'When are expressions of interest due?' %>
            </div>
            <div class="col-md-4">
            <%= f.input :commencement, :as => :date_picker, :label => 'Commencement date' %>
            </div>
            <div class="col-md-4">
            <%= f.input :expiry, :as => :date_picker, :label => 'Expiry date' %>
            </div>
        </div>

    </div>

    <div class="row">
        <div class="col-md-6" style="margin-bottom: 50px">
          <%= link_to_remove_association 'Remove schedule', f %>
        </div>

    </div>
</div>

通过以下链接将次要表单字段呈现在另一个表单中:

<%= f.simple_fields_for :tenor do |f| %>
        <%= f.error_notification %>
          <%= render 'tenors/tenor_fields', f: f %>

      <% end %>

      <%# unless @bip.tenor.present? %>
        <%= link_to_add_association 'Add key dates', f, :tenor, partial: 'tenors/tenor_fields', force_non_association_create: true %>
      <%# end %>   

bip和男高音之间存在一对一的关联。

当我编辑现有记录时,date_picker正常工作。我可以点击日历图标,它会显示日历。

但是,当我尝试创建新记录时,date_picker不会执行任何操作。我点击日历图标,没有任何反应。 chrome检查器中没有显示控制台错误。我可以在输入框中手动输入日期,但我无法从日历中选择日期。我可以提交带有手动插入日期的表单,但日期细节不会保存到数据库中(记录保持为“无”)。

我的输入/ date_picker_input.rb有

class DatePickerInput < SimpleForm::Inputs::StringInput
  def input(wrapper_options)
    set_html_options
    set_value_html_option

    template.content_tag :div, class: 'input-group date datetimepicker' do
      input = super(wrapper_options) # leave StringInput do the real rendering
      input + input_button
    end
  end

  def input_html_classes
    super.push ''   # 'form-control'
  end

  private

  def input_button
    template.content_tag :span, class: 'input-group-btn' do
      template.content_tag :button, class: 'btn btn-default', type: 'button' do
        template.content_tag :span, '', class: 'fa fa-calendar'
      end
    end
  end

  def set_html_options
    input_html_options[:type] = 'text'
    input_html_options[:data] ||= {}
    input_html_options[:data].merge!(date_options: date_options)
  end

  def set_value_html_option
    return unless value.present?
    input_html_options[:value] ||= I18n.localize(value, format: display_pattern)
  end

  def value
    object.send(attribute_name) if object.respond_to? attribute_name
  end

  def display_pattern
    I18n.t('datepicker.dformat', default: '%d/%m/%Y')
  end

  def picker_pattern
    I18n.t('datepicker.pformat', default: 'DD/MM/YYYY')
  end

  def date_view_header_format
    I18n.t('dayViewHeaderFormat', default: 'MMMM YYYY')
  end

  def date_options_base
    {
        locale: I18n.locale.to_s,
        format: picker_pattern,
        dayViewHeaderFormat: date_view_header_format
    }
  end

  def date_options
    custom_options = input_html_options[:data][:date_options] || {}
    date_options_base.merge!(custom_options)
  end

end

如果我正在编辑现有记录,那么有人可以想到为什么date_picker可以正常工作但如果我想创建新记录则无法正常工作吗?

在控制器中创建操作

组织

def create
    @organisation = Organisation.new(organisation_params)

    respond_to do |format|
      if @organisation.save
        format.html { redirect_to @organisation, notice: 'Organisation was successfully created.' }
        format.json { render :show, status: :created, location: @organisation }
      else
        format.html { render :new }
        format.json { render json: @organisation.errors, status: :unprocessable_entity }
      end
    end
  end

的Bip

def create
    @bip = Package::Bip.new(bip_params)
    # authorize @bip

    respond_to do |format|
      if @bip.save
        format.html { redirect_to @bip }
        format.json { render :show, status: :created, location: @bip }
      else
        format.html { render :new }
        format.json { render json: @bip.errors, status: :unprocessable_entity }
      end
    end
  end

男高音

def create
    @tenor = Tenor.new(tenor_params)
    # authorize @tenor

    respond_to do |format|
      if @tenor.save
        format.html { redirect_to @tenor }
        format.json { render :show, status: :created, location: @tenor }
      else
        format.html { render :new }
        format.json { render json: @tenor.errors, status: :unprocessable_entity }
      end
    end
  end

新动作

组织

 def new
        @organisation = Organisation.new
        @organisation.bips
        # @organisation.bips.build_tenor
    end

BIPS

def new
    @bip = Package::Bip.new
    # authorize @bip
  end

男高音

def new
    @tenor = Tenor.new
    # authorize @tenor
  end

0 个答案:

没有答案