我有一个用于创建新模型的简单表单。该模型具有在 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/