Rails form_with значение скрытого поля зашифровано для нового объекта - PullRequest
0 голосов
/ 23 января 2020

У меня есть простая форма для создания новой модели. Модель имеет атрибут 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 + Isxx9ACmI2a9hcp4dOEszqztFy5A8pfIxex * * * * 10 *

Я пытался явно указать значение в форме, но это не меняет созданный 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 на Rails (Rails 6.0.2.1).

CSP

При дальнейшем исследовании кажется, что это как-то связано с политикой безопасности контента и Turbolinks и / или U JS

Это мой 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

Я заметил, что иногда, при навигации, браузер фактически перемещается к ссылка вместо Turbolink'ов, выполняющих свою работу (хотя в этих случаях не регистрируется нарушение CSP), где в том же случае без NO 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, похоже, снова будут работать как ожидалось ...

...