我正在视图中进行编辑操作,其中包含模型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以正确的方式发送给请求:
我正在使用的路由是标准的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"):
答案 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][]
所混淆,但我很确定这是我之前使用它的方式并且它已经有效。