我正在阅读Michael Hartl的Rails教程。 chapter 8
的其中一项练习是使用form_tag
而不是form_for
重写代码。在查看了form_for
给我的来源并在Rails文档中查找每个tag
之后,我能够成功地将它组合在一起。
我的问题是:Rails如何知道id
属性为<input>
创建的text_field_tag
标记,以便它与id
匹配<label>
由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="✓" /><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=>"session_email"}" />
<label for="session_password">Password</label>
<input id="session_password" name="session[password]" type="password" value="{:id=>"session_password"}" />
<button name="commit" type="submit">Sign in</button>
答案 0 :(得分:0)
请注意,从Rails 5.1开始,推荐使用的表单助手为form_with。
并且form_with
不再像以前的id
和class
一样自动为DOM元素生成form_for
和form_tag
。
这对于添加像label
这样的标记(这些标记用于会自动链接到其相应的输入字段)具有影响。 现在,要使标签正确地与输入字段配对(带有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和类”。