簡體   English   中英

Rails 在添加新的嵌套記錄時錯誤解釋 http 方法

[英]Rails wrongly interpreting http method when adding new nested record

我有一個帶有嵌套屬性字段的表單,使用form_with model:

<%= form_with model: [ :admin, @event ], local: true, class: "event-form" do |form| %>
  <%= form.hidden_field :event_category_id %>

  <div class="row">
    <div class='col-xs-12 col-sm-7'>
      <ul class="nav nav-tabs" role="tablist">
        <li role="presentation" class="active">
          <a href="#<%= dom_id @event %>-pl-tab" aria-controls="pl" role="tab" data-toggle="tab">Wersja Polska</a>
        </li>
        <li role="presentation"><a href="#<%= dom_id @event %>-en-tab" aria-controls="en" role="tab" data-toggle="tab">Wersja Angielska</a></li>
      </ul>
      <div class="tab-content">
        <div role="tabpanel" class="tab-pane panel panel-default fade in active" id="<%= dom_id @event %>-pl-tab">
          <div class='panel-body'>
            <div class='checkbox'>
              <label>
                <%= form.check_box :pl_active, class: 'panel-activator' %>
                Aktywna
              </label>
            </div>
...

在那種形式中,我使用fields_for嵌套屬性:

<div class='panel panel-default'>
        <div class='panel-heading'>
          <div class='row'>
            <div class='col-xs-6'>
              <%= form.label :event_variants %>
            </div>
            <div class='col-xs-6 text-right'>
              <%=link_to 'Dodaj', new_admin_event_variant_path( event_id: @event, index: @event.event_variants.size ), id: "add-event-variant", class: 'btn btn-sm btn-primary', remote: true %>
            </div>
          </div>
        </div>
        <div class='panel-body event-variants sortable'>
          <%- @event.event_variants.each_with_index do |event_variant, index| %>
            <%= render partial: 'admin/event_variants/form', locals: { event_variant: event_variant, index: index } %>
          <% end %>
        </div>
      </div>

部分看起來像:

<div id="event_variant-<%= index %>" class='panel panel-default'>
  <%= fields_for "event[event_variants_attributes][]", event_variant, child_index: index do |fields| %>
    <%= fields.hidden_field :id %>
    <%= fields.hidden_field :position %>
    <%= fields.hidden_field :_destroy %>
    <div class='panel-heading'>
      <div class='row'>
        <div class='col-xs-6 variant-title'>
          <%= event_variant.pl_title || 'Nowy element' %>
        </div>
        <div class='col-xs-6 text-right'> 
          <label class='btn btn-sm btn-primary'>
            <%= event_variant.image&.file.present?  ? 'Zmień zdjęcie' : 'Dodaj zdjęcie' %>
            <%= fields.file_field :image, style: 'display:none', class: 'add-image' %>
          </label>
          <div class='btn btn-sm btn-danger remove-variant'>Usuń</div>
        </div>
      </div>
    </div>
    <div class='image-container' style="background-image:url('<%= event_variant.image&.file.present? ? event_variant.image.url : image_path('no-image-icon') %>')" >
    </div>
    <div class='panel-body'>
      <ul class="nav nav-tabs" role="tablist">
        <li role="presentation" class="active">
          <a href="#event_variant-<%= index %>-pl-tab" aria-controls="pl" role="tab" data-toggle="tab">Wersja Polska</a>
        </li>
        <li role="presentation"><a href="#event_variant-<%= index %>-en-tab" aria-controls="en" role="tab" data-toggle="tab">Wersja Angielska</a></li>
      </ul>
      <div class="tab-content">
        <div role="tabpanel" class="tab-pane panel panel-default fade in active" id="event_variant-<%= index %>-pl-tab">
          <div class='panel-body'>
            <div class='checkbox'>
              <label>
                <%= fields.check_box :pl_active, class: 'panel-activator' %>
                Aktywna
              </label>
            </div>
            <div class="form-group">
              <%= fields.label :pl_title %>
              <%= fields.text_field :pl_title, class: 'form-control', disabled: !event_variant.pl_active %>
            </div>
            <div class="form-group">
              <%= fields.label :pl_description %>
              <%= fields.text_field :pl_description, class: 'form-control', disabled: !event_variant.pl_active %>
            </div>
          </div>
        </div>
        <div role="tabpanel" class="tab-pane panel panel-default fade" id="event_variant-<%= index %>-en-tab">
          <div class='panel-body'>
            <div class='checkbox'>
              <label>
                <%= fields.check_box :en_active, class: 'panel-activator' %>
                Aktywna
              </label>
            </div>
            <div class="form-group">
              <%= fields.label :en_title %>
              <%= fields.text_field :en_title, class: 'form-control', disabled: !event_variant.en_active %>
            </div>
            <div class="form-group">
              <%= fields.label :en_subtitle %>
              <%= fields.text_field :en_description, class: 'form-control', disabled: !event_variant.en_active %>
            </div>
          </div>
        </div>
      </div>
    </div>
  <% end %>
</div>

那是與主要 model 相關的has_many屬性,因此除了編輯每個嵌套 model 的字段之外,我可以單擊以呈現新fields_for partial 以創建 nem 嵌套記錄 - 我猜是常見的事情:

<%=link_to 'Dodaj', new_admin_event_variant_path( event_id: @event, index: @event.event_variants.size ), id: "add-event-variant", class: 'btn btn-sm btn-primary', remote: true %>

即將:

def new
    @event = Event.find params[:event_id]
    @event_variant = @event.event_variants.build( pl_active: false, en_active: false )
    @index = params[:index]
  end

並渲染js.erb

$('.event-variants').append("<%= j render( partial: 'form', locals: { event_variant: @event_variant, index: @index } ) %>")

當我嘗試編輯主記錄時,問題就開始了。 當我只更改字段值、添加圖像等時,無論是在主字段還是嵌套字段中,它都可以正常工作,發送 PATCH,更新記錄和嵌套字段。

但是:當我嘗試添加新的嵌套記錄時,通過js.erb呈現的那些字段,表單使用 POST 而不是 PATCH 發送到 route: /events/:id ,當然還有它生成RoutingError

Invalid or incomplete POST params
Started POST "/admin/events/14" for 127.0.0.1 at 2019-09-16 11:19:11 +0200

ActionController::RoutingError (No route matches [POST] "/admin/events/14"):

表單屬性沒有改變。 HTML 仍然看起來像:

<div class="panel-body">
  <form class="event-form" enctype="multipart/form-data" action="/admin/events/14" accept-charset="UTF-8" method="post">
    <input name="utf8" type="hidden" value="✓">
    <input type="hidden" name="_method" value="patch">
    <input type="hidden" name="authenticity_token" value="Z3Uhd6EgZ+N16P5MKbqLDs3F1d94iEokD4O5q63V04q/ofFblB5sRCmEO2m+coHayDrQ/zDNVHSzfSzmDGrxog==">
    <input type="hidden" value="2" name="event[event_category_id]">

    <div class="row">
      <div class="col-xs-12 col-sm-7">
        <ul class="nav nav-tabs" role="tablist">
          <li role="presentation" class="active">
            <a href="#event_14-pl-tab" aria-controls="pl" role="tab" data-toggle="tab">Wersja Polska</a>
          </li>
          <li role="presentation"><a href="#event_14-en-tab" aria-controls="en" role="tab" data-toggle="tab">Wersja Angielska</a></li>
        </ul>
        <div class="tab-content">
          <div role="tabpanel" class="tab-pane panel panel-default fade in active" id="event_14-pl-tab">
            <div class="panel-body">
              <div class="checkbox">
                <label>
                  <input name="event[pl_active]" type="hidden" value="0">
                  <input class="panel-activator" type="checkbox" value="1" checked="checked" name="event[pl_active]">
                Aktywna
                </label>
...

即使_method字段設置為 PATCH,即使我通過方法在 form_with 中手動設置method: @event.persisted??:patch::post

當沒有新的嵌套記錄時一切正常。 最后但並非最不重要的一點是,提交時我不會通過 js onSubmitonClick更改任何內容。

有什么想法可以在這里出錯嗎?

當表單字段無效時,我遇到了這個問題。

name="blah[]" # this isn't valid

請參閱ajax 帖子上的 ActionController::BadRequest(無效的請求參數:預期的 Array (got Rack::QueryParser::Params)

在這個文件中插入一個pry幫助我解決了/2.7.4/lib/ruby/gems/2.7.0/gems/rack-2.2.3.1/lib/rack/method_override.rb

def method_override_param(req)
   binding.pry
   req.POST[METHOD_OVERRIDE_PARAM_KEY]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM