类shop
accepts_nested_attributes_for :shopzones, allow_destroy: true
当shops_controller定义操作并尝试定义强参数时
def shopzone
@shopzone = Shopzone.new
@shopzone.save
end
def shopzone_params # in addition to the def shop_params method
params.require(:shopzone).permit(:shop_id, :name, :sequence, :area)
end
一种形式
<%= form_with url: shopzone_shop_path(id: @shop.id) do |f| %>
<%= f.hidden_field 'shopzone[shop_id]', value: @shop.id %>
<div class='grid-x grid-padding-x'>
<div class='cell small-3 alert'>
<%= t('name') %>
<%= f.text_field 'shopzone[name]' %>
<%= t('sequence') %>:
<%= f.number_field 'shopzone[sequence]' %>
</div>
</div>
<div class='grid-x grid-padding-x'>
<div class='cell small-12 text-center'>
<%= f.submit t('create'), class: 'button' %>
</div>
</div>
<% end %>
但在默认情况下,它不会按照预期呈现data-remote="true"
。
<form action="/shops/3/shopzone" accept-charset="UTF-8" method="post">
提交后,参数将记录下来,但指向预期的HTML响应
Processing by ShopsController#shopzone as HTML
Parameters: {"authenticity_token"=>"[FILTERED]", "shopzone"=>{"shop_id"=>"3", "name"=>"central", "sequence"=>"1"
如果窗体被编辑为
<%= form_with(url: shopzone_shop_path(id: @shop.id), local: false) do |f| %>
然后,数据远程呈现。
<form action="/shops/3/shopzone" accept-charset="UTF-8" data-remote="true" method="post">
但是,服务器响应仍然期望处理HTML
Processing by ShopsController#shopzone as HTML
[...]
ActionController::UnknownFormat (ShopsController#shopzone is missing a template for this request format and variant.
request.formats: ["text/html"]
因此,第一个奇怪的问题是rails所谓的默认行为没有出现?
如果controlelr操作附加于
respond_to do |format|
format.js
end
进程正在运行。
Started POST "/shops/3/shopzone" for ::1 at 2021-06-11 10:34:28 +0200
Processing by ShopsController#shopzone as JS
Parameters: {"authenticity_token"=>"[FILTERED]", "shopzone"=>{"shop_id"=>"3", "name"=>"central", "sequence"=>"1" [...]
然后抱怨模型上存在的有效性。
ActiveRecord::RecordInvalid (Validation failed: Shop must exist, Sequence can't be blank, Name can't be blank):
这与提交的参数相反。在保存puts @shopzone.inspect
之前检查操作中的参数,有效地返回零参数。
因此,嵌套属性的一些内容是抛出默认行为。
将请求作为不引人注目的JS处理的最佳过程是什么?
发布于 2021-06-11 09:17:50
我将提及你问题的一部分,因为你提出了几个问题:
由于Rails 6.1默认情况下是非ajax的,所以要使form_with成为ajax,您必须传递local: false
或将全局配置选项(config.action_view.form_with_generates_remote_forms
)设置为true。
比较form_with Rails 5.2文档 .
本地-默认情况下,表单提交是远程的和不引人注目的XHR。禁用带有本地: true的远程提交。
本地-默认情况下,表单通过典型的HTTP请求提交。启用远程和不显眼的XHR,并使用local: false提交。默认情况下,可以通过设置config.action_view.form_with_generates_remote_forms = true启用远程窗体
我看到的另一件事是,您没有对see区域params做任何事情,但是即使这可以重新考虑如何构建它,这也不是嵌套属性的标准用法。
def shopzone
@shopzone = Shopzone.new(shopzone_params) # you forgot this!
@shopzone.save
end
def shopzone_params # in addition to the def shop_params method
params.require(:shopzone).permit(:shop_id, :name, :sequence, :area)
end
https://stackoverflow.com/questions/67933849
复制相似问题