第十七、八章补遗(四)

第十七、八章补遗(四)

第四部分 表单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

posted @ 2007-02-17 11:03  海浪~~  阅读(278)  评论(0)    收藏  举报