3

我有一个用于创建新模型的简单表格。该模型具有panel在控制器中设置的属性。我认为这应该没关系,但它panel是一个枚举。

def new
  @order = Order.new(panel: params[:panel])
end

在视图中,我创建了以下表单(省略了其他属性,因为与问题无关)

<%= form_with model: @order do |f| %>
<%= f.hidden_field :panel %>
<% end %>

问题

panel问题是,它使用一些散列或加密值而不是正确值创建了一个输入字段panel

<input type="hidden" value="TfVtJbT4RBcPdCCqrkap+dA8uhJvotCH02+Isxx9ACmI2a9hcp4dOEszqztFy5A8pfIxqi35SW7BexQfYvq8BQ==" name="order[panel]" id="order_panel">

尝试提交此表单时,我收到一个有意义的错误...

ArgumentError('TfVtJbT4RBcPdCCqrkap+dA8uhJvotCH02+Isxx9ACmI2a9hcp4dOEszqztFy5A8pfIxqi35SW7BexQfYvq8BQ==' 不是有效面板)

备择方案

我试图在表单中明确指定值,但这不会更改创建的 HTML,因此仍然存在同样的问题。

<%= form_with model: @order do |f| %>
<%= f.hidden_field :panel, value: @order.panel %>
<% end %>

解决方法

到目前为止唯一有效的是创建一个text_field并将其设置为隐藏

<%= form_with model: @order do |f| %>
<%= f.text_field :panel, value: @order.panel, hidden: true %>
<% end %>

这将创建正确的值:

<input value="sport" type="text" name="order[panel]" id="order_panel" hidden="hidden">

这是正确的方法吗?为什么hidden_field不能按预期工作?我错过了什么?

这是最新版本的 Ruby on Rails (Rails 6.0.2.1)。

CSP

经过进一步调查,这似乎与内容安全政策和 Turbolinks 和/或 UJS 有某种关系

这是我的 CSP:

Rails.application.config.content_security_policy do |policy|
  policy.default_src :self, :https
  policy.font_src    :self, :https, :data
  policy.img_src     :self, :https, :data
  policy.object_src  :none
  policy.script_src  :self, :https
  policy.style_src   :self, :https, :unsafe_inline
  policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
end

# If you are using UJS then enable automatic nonce generation
Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }

# Set the nonce only to specific directives
Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
# Rails.application.config.content_security_policy_report_only = true

我注意到有时,在四处导航时,浏览器实际上导航到链接而不是 Turbolinks 做他们的工作(即使在这些情况下,没有记录 CSP 违规),在没有 CSP 的同一实例中,Turbolinks 按预期工作.

我已经包含了我的 Javascriptnonce: content_security_policy_nonce

<%= javascript_pack_tag 'application', nonce: content_security_policy_nonce, 'data-turbolinks-track': 'reload' %>

如果我删除nonce: content_security_policy_nonce这里,Turbolinks 似乎再次按预期工作......

4

1 回答 1

3

您尚未在问题中指定浏览器,但存在Firefox 自动完成过于激进并覆盖隐藏字段值的问题。该问题已关闭,但有人在 5 月使用版本 75 抱怨它。

尝试禁用给定字段的自动完成功能,如下所示:

<%= f.hidden_field :panel, autocomplete: 'off' %>
于 2020-09-08T12:37:10.533 回答