第十七、八章补遗(四)
第十七、八章补遗(四)
第四部分 表单Helper方法
一、FormTagHelper
模板内的HTML表单应该由form_tag()开始,用end_form_tag()结束。传递给form_tag()的第一个参数是哈希表,它用于在表单被提交时确定被调用的动作。这个哈希表接受与url_for()同样的选项。可选的第二个参数是另一个哈希表,让你设置HTML表单标记本身的属性,做为一个特例如果这个哈希表包含:multipart => true,表单将返回multipart表单数据,允许它被用于文件的上传。
例如: <%= form_tag {:action => :save }, { :class => “compact” } %>
start_form_tag是form_tag的别名。
end_form_tag()不接受参数。
在这个模块内,Rails也提供了对创建无相应模型字段的支持。这些方法都接受一个简单的字段名字,而不是一个模型对象和属性,当表单被提交给控制器时,字段的内容被存储在params哈希表内相应的名字中。这些非模型方法的名字尾部都带有tag字样。
二、FormHelper
提供了一组与表单工作的方法,特别是表单与赋值给模板的对象关联起来。下面是一个完整的表单例子,用所有的表单帮助方法,来完成 person 对象的创建和更新工作。@person 对象被赋值为控制器的一个动作:
<form action="save_person" method="post">
Name:
<%= text_field "person", "name", "size" => 20 %>
Password:
<%= password_field "person", "password", "maxsize" => 20 %>
Single?:
<%= check_box "person", "single" %>
Description:
<%= text_area "person", "description", "cols" => 20 %>
<input type="submit" value="Save">
</form>
…会被编译成:
<form action="save_person" method="post">
Name:
<input type="text" id="person_name" name="person[name]"
size="20" value="<%= @person.name %>" />
Password:
<input type="password" id="person_password" name="person[password]"
size="20" maxsize="20" value="<%= @person.password %>" />
Single?:
<input type="checkbox" id="person_single" name="person[single]"
value="1" />
Description:
<textarea cols="20" rows="40" id="person_description"
name="person[description]">
<%= @person.description %>
</textarea>
<input type="submit" value="Save">
</form>
如果你需要在一个表单上编辑来自同一模型的多个对象,把你传递给表单帮助方法的实例变量的名字用方括号括起来,这会告诉Rails来包括对象的id做为字段名字的一部分。
<%= text_field "person[]", "name" %>
…会变成:
<input type="text" id="person_<%= @person.id %>_name"
name="person[<%= @person.id %>][name]" value="<%= @person.name %>" />
再看个例子,下面模板可让用户选择一个或多个与产品列表相关的imageURL。
<%= start_form_tag %>
<% for @product in @products %>
<%= text_field “product[]”, “image_url”) %><br />
<% end %>
<%= submit_tag %>
<%= end_form_tag %>
当表单被提交给控制器时,params[:product]将是个含有哈希表的哈希表,它的每个键都是模型对象的id,并且相关的value是来自那个对象的表单的值。在控制器内,这会被用于更新所有像这样的产品行
Product.update(params[:product].keys, params[:product].values)
这个模块内的所有Helper方法至少接受两个参数。第一个是实例变量(典型是个模型)的名字。第二个参数是被查询实例变量的属性。这两个参数也一起生成HTML标记的名字。所有的Helper方法也接受一个可选的哈希表,它典型地被用于设置HTML的class。这个哈希表是可选的第三个参数,但对于radio按钮来说,它则是第四个参数。
1、check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")
通常未检查的 checkbox 不会post 任何东西。 解决这个问题的方法是添加一个与 checkbox 同名的隐藏值。
例如,假设@post.validated?返回1:
check_box("post", "validated")
<input type="checkbox" id="post_validate" name="post[validated]"
value="1" checked="checked" />
<input name="post[validated]" type="hidden" value="0" />
例如,假设@puppy.gooddog 返回no:
check_box("puppy", "gooddog", {}, "yes", "no")
<input type="checkbox" id="puppy_gooddog"
name="puppy[gooddog]" value="yes" />
<input name="puppy[gooddog]" type="hidden" value="no" />
2、file_field(object_name, method, options = {}) 与 text_field 类似,但返回一个 "file" 类型的 input 标记,它没有缺省值。
3、hidden_field(object_name, method, options = {}) 与 text_field 类似,但返回一个 "hidden" 类型的 input 标记。
4、password_field(object_name, method, options = {}) 与 text_field 类似,但返回一个 "password" 类型的 input 标记。
5、radio_button(object_name, method, tag_value, options = {}) 返回一个 radio 按钮标记,用于访问被赋值给模板的对象(由object 来区别)的一个指定属性。如果 method 的当前值是 tag_value ,则radio 按钮将被选择。input 标记上的额外选项可以由 options 哈希表传递。
例如:
radio_button("post", "category", "rails")
radio_button("post", "category", "java")
<input type="radio" id="post_category" name="post[category]"
value="rails" checked="checked" />
<input type="radio" id="post_category" name="post[category]" value="java" />
6、text_area(object_name, method, options = {}) 返回一个 textarea 开,合标记,用于访问被赋值给模板的对象(由object 来区别)的一个指定属性。input 标记上的额外选项可以由 options 哈希表传递。
例如:
text_area("post", "body", "cols" => 20, "rows" => 40)
<textarea cols="20" rows="40" id="post_body" name="post[body]">
#{@post.body}
</textarea>
7、text_field(object_name, method, options = {}) 返回一个 text 标记,用于访问被赋值给模板的对象(由object 来区别)的一个指定属性。input 标记上的额外选项可以由 options 哈希表传递。
例如:
text_field("post", "title", "size" => 20)
<input type="text" id="post_title" name="post[title]"
size="20" value="#{@post.title}" />
三、FormOptionsHelper

浙公网安备 33010602011771号