【问题标题】:Turn autocomplete off with rails form_tag使用 rails form_tag 关闭自动完成功能
【发布时间】:2014-09-07 00:49:31
【问题描述】:

我正在尝试在我的一种 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'

当我访问我的表单时,我的电子邮件地址和保存的密码已经填写完毕。我在这里做错了什么?我喜欢 Rails,但它有时真的让我发疯。

【问题讨论】:

    标签: ruby-on-rails forms autocomplete autofill


    【解决方案1】:

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

    希望这会有所帮助!

    【讨论】:

    • 好时机 - 我昨天发布了这个问题(或类似问题),今天才找到你的答案。完美运行 - 谢谢!
    • 很高兴它有帮助。 :-)
    • @MattSanders 使用 html 对我不起作用,在阅读文档状态 Any other key creates standard HTML attributes for the tag 后,我刚刚删除了 html 并只使用了 form_tag my_path { autocomplete: "off" },这对我有用跨度>
    • @Marklar - 感谢您的更新。您使用的是什么版本的导轨?新版本中的行为可能有所改变。
    【解决方案2】:

    在最新版本的 chrome 中 autocomplete: 'off' 不起作用。而是使用autocomplete: 'disabled'

    【讨论】:

    • 注意:在 Internet Explorer 中:“除 off 之外的任何字符串都会启用 AutoComplete。”
    • 另外,“从 Internet Explorer 11 开始,输入 type=password 字段不再支持自动完成属性。”
    【解决方案3】:

    自动完成属性应该像这样分配给 html 键:

    html: {autocomplete: 'off'}
    

    【讨论】:

      【解决方案4】:

      有几种方法可以关闭自动完成功能:

      在表单级别:(自动完成所有输入)

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

      【讨论】:

      • 谢谢,但这些选项都不适用于 form_tag。第一个和第三个建议适用于 form_for(以及类似 simple_form 的衍生产品),第二个建议生成以下 html:&lt;input id="email" name="email" options="{:autocomplete=&gt;&amp;quot;off&amp;quot;}" type="email"&gt;。 form_tag 的文档显示没有名为 :options 的选项。
      • 对不起...没有名为 :options 的选项,你是绝对正确的。只需添加您的附加属性,就像在我编辑的版本中一样。通过这种方式,您甚至可以添加“foo='bar'。form_tag 也是如此......请参阅 API 文档:apidock.com/rails/ActionView/Helpers/FormTagHelper/…
      • 哈,您的新建议会导致 rails 抛出异常 :) autocomplete = 'off' 是有效的 html,但不是 ERB 或 HAML。无论如何,我想我一定做了一些有趣的事情,比如在关闭自动完成之前保存我的密码。如果我删除保存的密码并从一开始就关闭自动完成功能再试一次,也许我会有一些运气。再次感谢。
      • 呵呵...好吧。但正如文档中所述,它应该通过在简单的“等于”行中添加其他选项来工作。我没有使用 form_tag 的项目,所以我不得不猜测。我很欣赏 form_for 或 formtastic 的便利。祝你好运!
      【解决方案5】:

      编辑: 不幸的是,这种方法有缺点

      1. 在验证错误和render :xxx 后字段未填写
      • 解决这个问题的方法是alias_attribute :c_ountry, :country,但我个人不喜欢它的hackyness
      1. 方法不适用于英语语言环境(至少对我而言),但适用于其他语言环境

      编辑 2: 最终我结合了我在more general question 中描述的三种方法来解决它

      原答案:

      这是 HTML 的错,主要是 Chrome,而不是 Rails。

      截至 2020 年 12 月Chrome 87 上述所有解决方案均不适用于我,autocomplete、@987654325 的网络上的许多变体也不适用@、onclicktype 等属性的解决方法。

      防止自动填充

      的解决方案

      有效的方法是不使用全名命名字段。即,如果我们有国家和城市字段,那么而不是这个

      = 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
      

      【讨论】:

        猜你喜欢
        • 2014-09-28
        • 2011-10-23
        • 1970-01-01
        • 2016-09-26
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-29
        相关资源
        最近更新 更多