Отключите автозаполнение с помощью rails form_tag

Я пытаюсь отключить автозаполнение в одной из моих форм rails. Вот что я пробовал до сих пор:

# add it at the form level
= form_tag admin_sessions_path, autocomplete: "off" do

Это не сработало.

# add it at the element level
.panel
  = label_tag :email
  = email_field_tag :email, params[:email], autocomplete: 'off'

Ни то, ни другое.

# add it to both
= form_tag admin_sessions_path, autocomplete: "off" do

  # add it at the element level
  .panel
    = label_tag :email
    = email_field_tag :email, params[:email], autocomplete: 'off'

Когда я захожу в форму, мой адрес электронной почты и сохраненный пароль уже заполнены. Что я здесь делаю неправильно? Я люблю рельсы, но иногда они действительно сводят меня с ума.


person stephenmurdoch    schedule 16.07.2014    source источник


Ответы (5)


Начиная с Rails 4+

Отключить автозаполнение для всей формы с помощью form_tag:

= form_tag admin_sessions_path, html: { autocomplete: "off" } do

Отключить автозаполнение для всей формы с помощью form_for:

= form_for @user, html: { autocomplete: "off" } do |f|

Отключить автозаполнение для одного элемента формы:

= f.text_field :foo, autocomplete: 'off'

Надеюсь это поможет!

person Matt Sanders    schedule 19.01.2016
comment
Отличное время - я разместил этот вопрос (или аналогичный) вчера и только сегодня нашел ваш ответ. Работает отлично - спасибо! - person Zoinks10; 20.01.2016
comment
Рад, что это было полезно. :-) - person Matt Sanders; 21.01.2016
comment
@MattSanders, использующий html, у меня не работал, и после прочтения состояния документации Any other key creates standard HTML attributes for the tag я просто удалил html и просто получил form_tag my_path { autocomplete: "off" }, что сработало для меня. - person Marklar; 03.04.2018
comment
@Marklar - спасибо за обновление. Какую версию рельсов вы используете? Поведение могло быть изменено в более новых версиях. - person Matt Sanders; 23.04.2018
comment
5.1 справочник по документации - person Marklar; 24.04.2018
comment
Я всегда забываю использовать хэш html: {} для установки опции. Спасибо! - person Francisco Quintero; 15.04.2019

атрибут автозаполнения должен быть назначен ключу html следующим образом:

html: {autocomplete: 'off'}
person dennis    schedule 16.07.2014

В последней версии хрома autocomplete: 'off' не работает. Вместо этого используйте autocomplete: 'disabled'

person Pooja    schedule 21.08.2019
comment
ПРИМЕЧАНИЕ. В Internet Explorer: любая строка, кроме off, включает автозаполнение. - person Joshua Pinter; 18.09.2019
comment
Кроме того, начиная с Internet Explorer 11 свойство автозаполнения больше не поддерживается для полей типа ввода=пароль. - person Joshua Pinter; 18.09.2019

Есть несколько способов отключить функцию автозаполнения:

На уровне формы: (автозаполнение отключено для всех входных данных)

<% form_tag(:form_name, @form_name, autocomplete = "off") do |f|%>

За вход:

<%= text_field_tag('my input', nil, autocomplete = 'off') %>

Простая форма для ввода:

<% f.text_field :fieldname, input_html: {autocomplete: 'off'} %>
person Oliver Zeyen    schedule 16.07.2014
comment
Спасибо, но ни один из этих вариантов не работает с form_tag. Первое и третье предложения работают с form_for (и производными, такими как simple_form), а второе генерирует следующий HTML: <input id="email" name="email" options="{:autocomplete=>&quot;off&quot;}" type="email">. Документы для form_tag показывают, что нет опции с именем :options. - person stephenmurdoch; 16.07.2014
comment
Извините... Нет опции под названием :options, вы абсолютно правы. Просто добавьте свои дополнительные атрибуты, как в моей отредактированной версии. Таким образом, вы даже можете добавить foo='bar'. То же самое для form_tag... См. документацию по API: apidock.com/rails/ActionView/Helpers /Формтегхелпер/ - person Oliver Zeyen; 16.07.2014
comment
Ха, ваши новые предложения заставляют рельсы генерировать исключение :) autocomplete = 'off' является допустимым html, но не ERB или HAML. В любом случае, я думаю, что, должно быть, сделал что-то смешное, например, сохранил свой пароль перед отключением автозаполнения. Возможно, мне повезет, если я удалю свои сохраненные пароли и попробую еще раз с отключенным автозаполнением с самого начала. Спасибо еще раз. - person stephenmurdoch; 16.07.2014
comment
Хе-хе... Хорошо. Но, как описано в документации, он должен работать, добавляя дополнительные параметры в строку с простыми равными. У меня нет проекта, использующего form_tag, поэтому мне пришлось догадываться. Я ценю удобство form_for или formtastic. Удачи! - person Oliver Zeyen; 16.07.2014

Изменить. К сожалению, у этого метода есть недостатки.

  1. Поля не заполняются обратно после ошибок проверки и render :xxx
  • решение этой проблемы состоит в том, чтобы сделать alias_attribute :c_ountry, :country, но лично мне не нравится его хакерство
  1. Метод не работает на английской локали (по крайней мере, у меня), но работает на других локалях

Редактировать 2: В конечном итоге я решил это с помощью комбинации трех подходов, которые я описал в более общем вопросе

Исходный ответ:

Это вина HTML и в основном Chrome, а не Rails.

По состоянию на декабрь 2020 г. и Chrome 87 все вышеперечисленные решения не работали у меня, равно как и многие варианты из Интернета с autocomplete, readonly, onclick, type и т. д. обходные пути атрибутов.

Решение для предотвращения автозаполнения

Что сработало, так это не называть поля их полными именами. т.е. если у нас есть поля страна и город, то вместо этого

= f.text_field :country
= f.text_field :city

сделай это

= f.text_field :c_ountry
= f.text_field :cit_y

Затем вручную переназначьте параметры в контроллере. то есть

def user_params
  params[:user][:country] = params[:user].delete(:c_ountry)
  params[:user][:city] = params[:user].delete(:cit_y)

  params.require(:user).permit(:country, :city)
end

Попался. Я заметил, что Chrome также запускает автозаполнение, когда находит другие слова в type. Например, я заметил, что это вызывает автозаполнение

= f.text_field :d_istrict

пока это не запускает автозаполнение

= f.text_field :d_istric_t
person ToTenMilan    schedule 18.12.2020