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