【问题标题】:Rails text_field_tag id attributeRails text_field_tag id 属性
【发布时间】:2014-03-28 04:09:30
【问题描述】:

我正在阅读 Michael Hartl 的 Rails 教程。 chapter 8 的练习之一是使用 form_tag 而不是 form_for 重写代码。在查看 form_for 给我的源代码并在 Rails 文档中查找每个 tag 之后,我能够成功地将它们组合在一起。

我的问题是:Rails 如何知道id 属性赋予text_field_tag 创建的<input> 标记,以便它匹配<label> 创建的id 标记label_tag在它之前?

这是表单的代码:

<%= form_tag(sessions_path) do %>

  <%= label_tag "session_email", "Email" %>
  <%= text_field_tag "session[email]" %>

  <%= label_tag "session_password", "Password" %>
  <%= password_field_tag "session[password]" %>

  <%= button_tag("Sign in", name: "commit", type: "submit") %>
<% end %>

这是生成的 html:

<form accept-charset="UTF-8" action="/sessions" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="c9a5KJveRSOQyDo/ckUtpmQAbjw2f1alnB6Dn1lu3XU=" /></div>

  <label for="session_email">Email</label>
  <input id="session_email" name="session[email]" type="text" value="{:id=&gt;&quot;session_email&quot;}" />

  <label for="session_password">Password</label>
  <input id="session_password" name="session[password]" type="password" value="{:id=&gt;&quot;session_password&quot;}" />

  <button name="commit" type="submit">Sign in</button>

【问题讨论】:

  • 它不知道,text_field_tag生成的id要么等于id选项,要么等于输入字段的名称,其中'['和']'被下划线'_代替',幸运的是,它与您标签的 id 匹配
  • 所以Rails查看text_field_tag,看到第一个参数是"session[email]",并推断它应该分配给结果&lt;input&gt;标签的id是“session_email”?
  • 是的,它不检查标签或其他什么,它只是遵循一个命名约定(我相信你在 Rails 教程中听说过),它很好地匹配每个元素
  • 哦,好吧,我知道范式是“约定优于配置”,但我不太习惯,所以有时我会忘记它。不过我已经习惯了,真的很方便。

标签: ruby-on-rails ruby forms input


【解决方案1】:

请注意,从 Rails 5.1 开始,推荐使用的表单助手是 form_with。 并且 form_with 不再像以前的 form_forform_tag 那样为 DOM 元素自动生成 idclass

这对添加像labels 这样的标记有影响,过去会自动链接到相应的输入字段。 现在,要使标签正确地与输入字段配对(使用for 属性),您需要明确id 属性添加到输入中。

示例

ERB:

<%= form_with model: User.new do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name, id: :user_name %>
<% end %>

生成 HTML:

<form action="/users" method="post">
  <label for="user_name">Name</label>
  <input id="user_name" type="text" name="user[name]">
</form>

另见

https://medium.com/@tinchorb/form-with-building-html-forms-in-rails-5-1-f30bd60ef52d,特别是标题“不再自动生成 id 和类”。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多