首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >默认form_with不远程,也不期望通过JS进行响应

默认form_with不远程,也不期望通过JS进行响应
EN

Stack Overflow用户
提问于 2021-06-11 08:40:30
回答 1查看 57关注 0票数 0

shop

代码语言:javascript
运行
复制
  accepts_nested_attributes_for :shopzones, allow_destroy: true

当shops_controller定义操作并尝试定义强参数时

代码语言:javascript
运行
复制
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

一种形式

代码语言:javascript
运行
复制
 <%= 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"

代码语言:javascript
运行
复制
<form action="/shops/3/shopzone" accept-charset="UTF-8" method="post">

提交后,参数将记录下来,但指向预期的HTML响应

代码语言:javascript
运行
复制
Processing by ShopsController#shopzone as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "shopzone"=>{"shop_id"=>"3", "name"=>"central", "sequence"=>"1"

如果窗体被编辑为

代码语言:javascript
运行
复制
<%= form_with(url: shopzone_shop_path(id: @shop.id), local: false) do |f| %>

然后,数据远程呈现。

代码语言:javascript
运行
复制
<form action="/shops/3/shopzone" accept-charset="UTF-8" data-remote="true" method="post">

但是,服务器响应仍然期望处理HTML

代码语言:javascript
运行
复制
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操作附加于

代码语言:javascript
运行
复制
respond_to do |format|
  format.js
end

进程正在运行。

代码语言:javascript
运行
复制
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" [...]

然后抱怨模型上存在的有效性。

代码语言:javascript
运行
复制
ActiveRecord::RecordInvalid (Validation failed: Shop must exist, Sequence can't be blank, Name can't be blank):

这与提交的参数相反。在保存puts @shopzone.inspect之前检查操作中的参数,有效地返回零参数。

因此,嵌套属性的一些内容是抛出默认行为。

将请求作为不引人注目的JS处理的最佳过程是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的远程提交。

Rails 6.1

本地-默认情况下,表单通过典型的HTTP请求提交。启用远程和不显眼的XHR,并使用local: false提交。默认情况下,可以通过设置config.action_view.form_with_generates_remote_forms = true启用远程窗体

我看到的另一件事是,您没有对see区域params做任何事情,但是即使这可以重新考虑如何构建它,这也不是嵌套属性的标准用法。

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67933849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档