[英]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 onSubmit
或onClick
更改任何內容。
有什么想法可以在這里出錯嗎?
當表單字段無效時,我遇到了這個問題。
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.