我有一个用于创建新模型的简单表格。该模型具有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 似乎再次按预期工作......