ruby-on-rails - Rails form_with hidden_​​field 值为新对象加密

标签 ruby-on-rails hidden-field ruby-on-rails-6 form-with

我有一个用于创建新模型的简单表单。该模型具有在 Controller 中设置的属性 panel。我认为这应该无关紧要,但 panel 是一个枚举。

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

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

<%= 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==' is not a valid panel)

备选方案

我试图在表单中明确指定值,但这并没有改变创建的 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) 上。

云服务提供商

经过进一步调查,这似乎与内容安全策略和 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 是按预期工作。

我已将我的 Javascript 包含在 nonce: content_security_policy_nonce

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

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

最佳答案

您没有在问题中指定浏览器,但是 Firefox autocomplete being too aggressive and overriding hidden field values 存在问题.该问题已关闭,但有人提示它在 5 月份使用 75 版。

尝试像这样禁用给定字段的自动完成:

<%= f.hidden_field :panel, autocomplete: 'off' %>

关于ruby-on-rails - Rails form_with hidden_​​field 值为新对象加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880707/

相关文章:

ruby-on-rails - 我如何接收 JSON :API post of nested attributes in Ruby on Rails?

ruby-on-rails - 如何在导出到 CSV 的 Ruby 方法中重构嵌套循环?

javascript - 根据选择框选择定义隐藏字段值

javascript - 它如何让单选按钮传递隐藏在 url 中的数据?

ruby-on-rails - 使用 Zeitwerk 自动加载器在 Rails 6 中命名空间服务对象

ruby-on-rails - 使用 Rails 6 实现 Google Adsense

ruby-on-rails - Rails 6 Active Storage : Could not find or build blob: expected attachable, 为零

ruby-on-rails - 嵌套资源的参数名称是什么

ruby-on-rails - 如何在 Rails 中包含自定义异常?

python - 如何抓取 - 跨 aria-hidden ="true"- 文本