提交另一个远程表单后,没有路由匹配[POST]“/ tracking_configs / 6”

时间:2017-01-17 15:05:06

标签: javascript ruby-on-rails forms haml

我正在视图中进行编辑操作,其中包含模型TrackingConfig的一个主要表单,它通常(非远程)提交,另一个辅助远程表单用于获取某些数据。

= form_for @tracking_config do |f|

  .event-fields
    = f.fields_for :tracking_event_configs do |ff|
      = render 'tracking_event_config_block', form: ff

  = f.submit 'Save', class: 'btn btn-danger'


= form_tag get_event_fields_tracking_configs_path, remote: true, method: :get do
  = select_tag :event_name, options_from_collection_for_select(TrackableEvent.all, :event_name, :event_name), prompt: 'Choose event to add'
  = submit_tag 'Add event config'

通过直接加载编辑页面并单击提交按钮,它会向更新操作发送一个PATCH请求,该操作非常有效:

  

启动PATCH“/ tracking_configs / 6”

但是当我使用第二个表单通过在.js.erb视图中呈现HTML来将项目添加到第一个表单时:

<%
  tracking_event_config_block = render(
    "tracking_event_config_block",
    form: ActionView::Helpers::FormBuilder.new(
      "tracking_config[tracking_event_configs_attributes][]",
      @tracking_event_config,
      self,
      {}
    )
  )
%>
$('.event-fields').append(
  '<%= j tracking_event_config_block %>'
)

然后按“保存”按钮会触发路由错误:

  

没有路线匹配[POST]“/ tracking_configs / 6”

奇怪的是,_method param以正确的方式发送给请求: enter image description here

我正在使用的路由是标准的Rails资源路由:

  resources :tracking_configs, only: [:new, :index, :create, :edit, :update] do
    collection do
      get 'get_event_fields'
    end
  end

要提到我对#new动作使用完全相同的形式,它在那里运作良好。

编辑:更新:我试图通过发送原始数据来模拟邮递员中的请求。即使将_method指定为patch,该请求也会导致Rails将其解释为POST请求:

Started POST "/data_collecting/tracking_configs/6" for 127.0.0.1 at 2017-01-18 10:35:23 +0100 
ActionController::RoutingError (No route matches [POST] "/data_collecting/tracking_configs/6"):

enter image description here

2 个答案:

答案 0 :(得分:0)

生成的表单仍然通过POST发送,尽管它有一个名为_methode的额外属性。

请参阅:ActionView::Helpers::FormHelper

我建议您使用:

match 'a_route' => 'controller#method', via: [:patch, :post]

答案 1 :(得分:0)

我设法通过更改生成其他字段的html的js响应中的这一行来解决具体问题:

"tracking_config[tracking_event_configs_attributes][]",

"tracking_config[tracking_event_configs_attributes][#{@event_config_index}]",

其中@event_config_index是我在请求中传递的参数。

似乎Rails在形式上完全被参数名称如tracking_config[tracking_event_configs_attributes][]所混淆,但我很确定这是我之前使用它的方式并且它已经有效。