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' %>