Rails form_with hidden_field зашифрованным значением для нового объекта

У меня есть простая форма для создания новой модели. Модель имеет атрибут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 не регистрируется), тогда как в том же случае с 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 снова работает должным образом...

0 ответов

Вы не указали браузер в своем вопросе, но существует проблема, связанная с тем, что автозаполнение Firefox слишком агрессивно и переопределяет значения скрытых полей. Проблема закрыта, но есть люди, которые жалуются на нее при использовании версии 75 в мае.

Попробуйте отключить автозаполнение для данного поля следующим образом:

<%= f.hidden_field :panel, autocomplete: 'off' %>
Другие вопросы по тегам