我有一个用于创建新模型的简单表单。该模型有一个属性panel
这是在控制器中设置的。我认为这应该不重要,但是panel
是一个枚举。
def new
@order = Order.new(panel: params[:panel])
end
在视图中,我创建了以下表单(省略了其他属性,因为与问题无关)
<%= form_with model: @order do |f| %>
<%= f.hidden_field :panel %>
<% end %>
Problem
问题是,这创建了一个输入字段panel
使用一些散列或加密的值而不是正确的值panel
value:
<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 会按预期工作。
我已经将我的 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 似乎再次按预期工作......