Agile Web Development with Rails 翻译(五十)

作者: 海浪~~
发布时间:2015-07-07 15:33:54

Agile Web Development with Rails 翻译(五十)

17.4 Helpers

先前我们说过可以在“模板”中放置代码。现在我们要纠正这句话。在“模板”内放置少量代码还是可以让人接受的这会让它们有更多动态性。但是,在“模板”内放置大量的代码就是糟糕的风格。


这有两个主要原因。首先,在你的应用程序“视图”端放置大量的代码,很容易会让你降低要求并开始添加应用级别的功能给“模板”内的代码。这是个糟糕的风格;你希望放置应用程序代码在“控制器”和“模型”层中,以便在任何地方都可以使用它们。在你给应用程序添加新的视图时你就会得到回报。

另一个原因是rhtml是基本的HTML。当你编辑它时,你正在编辑一个HTML文件。如果你有用于创建你的层的个人工具,它们会希望与HTML一起工作。放置Ruby代码块只会让它们很难协同工作。

Rails以“帮助方法”的形式提供了一个很好的拆中办法。“帮助方法”是个简单的模块,它包含用于帮助一个“视图”的方法。“帮助方法”是输出中心。它们存活于生成的HTML(XML)“帮助方法”扩展了一个“模板”的行为。

缺省地,每个“控制器”都它自己的“帮助方法”模块。不要惊讶Rails会使用某些假设来帮助连接“帮助方法”到“控制器”和它们的“视图”中。如果“控制器”的名字为BlogController,则它会自动地查找在app/helpers目录下的blog_helper.rb文件中,一个名为BlogHelper的“帮助方法”模块。你不必记忆这些细节生成“控制器”的脚本会自动地创建一个空的“帮助方法”模块。

----------------------------------------------------------

David Says. . .

Where’s the Template Language?

很多环境出于好的理由都不喜欢在“视图”中有代码。并不是所有的编程语言都能让自己以简洁,高效的方式来处理表现逻辑。对于代码来说,这些环境也允许你在处理“视图”时,可以使用其它主流语言。PHP的聪明,Java的速度,Python是支豹。

Rails本身没有什么,是因为Ruby在处理表现逻辑上已经很出色了。Do you need to show the capitalized body of a post, but truncating it to 30 characters?

这儿是Ruby内的“视图”代码。

<%= truncate(@post.body.capitalize, 30) %>

对于表现逻辑来说,使用Ruby会减少应用程序中你在不同“层”之间的切换。一切都使用Ruby—无论结构,模型,控制器,和视图。

----------------------------------------------------------

例如,用于我们store“控制器”的“视图”可能从实例变量@page_title(这些由“控制器”来推测)来设置生成页面的标题。如果@page_title没有被设置,“模板”使用文本“Paramatic Store”。每个“视图模板”的顶部看起来是这样

<h3><%= @page_title || "Pragmatic Store" %></h3>

<!-- ... -->

我们想移除“模板”之间的重复部分:如果商店的缺省名字被更改了,我们不想编辑每个“视图”。所以让我们把用于页标题代码移入一个“帮助方法”中。就像我们store“控制器”中做的一样,我们编辑app/helpers目录下的文件store_helper.rb

module StoreHelper

def page_title

@page_title || "Pragmatic Store"

end

end

现在“视图”中的代码只是简单地调用“帮助方法”。

<h3><%= page_title %></h3>

<!-- ... -->

(我们甚至可能想通过将整个标题移到一个单独的“局部模板”内以消除所有重复,并由所有的“控制器”的“视图”共享,但我们在359页的17.9节才能谈到些。)

Sharing Helpers

有时候一个“帮助方法”好到你必须在你的所有“控制器”中共享它。或许你有个漂亮的数据格式“帮助方法”,你想在所有的“控制器”中使用它。你有两个选择。

首先,你可以添加“帮助方法”给app/helpers目录内的application_helper.rb文件。就像它的名字暗示的,这个“帮助方法”对整个应用程序来说是全局的并且它的方法对所有“视图”都有效。

做为选择,你也可以告诉“控制器”使用helper声明来包含额外的“帮助方法”模块。例如,如果我们的日期格式“帮助方法”在app/helpers目录下的date_format_helper.rb文件内,我们可加载它,并将它混插到一个特定的用于设置“视图”的“控制器”内。

class ParticularController < ApplicationController

helper :date_format

# ...

你也可以包含一个已经被加载的类做为一个“帮助方法”,只要你将它的名字指给helper声明。

class ParticularController < ApplicationController

helper DateFormat

# ...

你可以使用helper_method将“控制器”的方法添加到“模板”中。在这么做之前要仔细想想你在冒着混淆商业和表现逻辑。更多细节查看helper_method文档。

17.5 Formatting Helpers

Rails带有一组内建的,对所有“视图”有效的“帮助方法”。这一节,我们会接触一些,但你或许想查看ActionView文档那儿有更多的功能描述。

一个用于处理日期,数字和文本格式的“帮助方法”。

<%= distance_of_time_in_words(Time.now, Time.local(2005, 12, 25)) %>

248 days

<%= distance_of_time_in_words(Time.now, Time.now + 33, false) %>

1 minute

<%= distance_of_time_in_words(Time.now, Time.now + 33, true) %>

half a minute

<%= time_ago_in_words(Time.local(2004, 12, 25)) %>

116 days

<%= human_size(123_456) %>

120.6 KB

<%= number_to_currency(123.45) %>

$123.45

<%= number_to_currency(234.56, :unit => "CAN$", :precision => 0) %>

CAN$235.

<%= number_to_percentage(66.66666) %>

66.667%

<%= number_to_percentage(66.66666, :precision => 1) %>

66.7%

<%= number_to_phone(2125551212) %>

212-555-1212

<%= number_to_phone(2125551212, :area_code => true, :delimiter => " ") %>

(212) 555 1212

<%= number_with_delimiter(12345678) %>

12,345,678

<%= number_with_delimiter(12345678, delimiter = "_") %>

12_345_678

<%= number_with_precision(50.0/3) %>

16.667

<%= number_with_precision(50.0/3, 1) %>

16.7

debug()方法使用YAML转储它的参数,并转义结果以便于它能够被显示在一个HTML页内。这对想查看“模型”对象内变量或请求的参数时,很帮助。

<%= debug(params) %>

--- !ruby/hash:HashWithIndifferentAccess

name: Dave

language: Ruby

action: objects

controller: test

还有处理文本的另一个帮助方法。这些方法可截取字符串,以及高亮度显示字符串内单词(useful to show search results, perhaps)

<%= simple_format(@trees) %> 格式化一个字符串,保留原有的行和段落的划分。You could give it the plain text of the Joyce Kilmer poem Trees and it would add the HTML to format it as follows:

<p> I think that I shall never see

<br />A poem lovely as a tree.</p>

<p>A tree whose hungry mouth is prest

<br />Against the sweet earth’s flowing breast;

</p>

<%= excerpt(@trees, "lovely", 8) %>

...A poem lovely as a tre...

<%= highlight(@trees, "tree") %>

I think that I shall never see

A poem lovely as a <strong >tree</strong>.

A <strong >tree</strong> whose hungry mouth is prest

Against the sweet earth’s flowing breast;

<%= truncate(@trees, 20) %>

I think that I sh...

There’s a method to pluralize nouns.

<%= pluralize(1, "person") %> but <%= pluralize(2, "person") %>

1 person but 2 people

If you’d like to do what the fancy web sites do and automatically hyperlink URLs and e-mail addresses, there’s a helper to do that. There’s another that strips hyperlinks from text.

最后,如果你写些类似于blog站点的东西,或者你允许用户添加评论给你商店,你应该提供给它们能创建Markdown(BlueCloth)Textile(RedCloth)格式文本的能力。这些接受文本的简单格式非常简单,有友善的标记并可转换到HTML。如果你在系统上安装了合适的库文件,[如果你使用RubyGames来安装库,你还需要添加一个适当的require_gem给你envirnment.rb文件。]这种文本可以使用markdown()textile()“帮助方法”被提交给“视图”。

17.6 Linking to Other Pages and Resources

ActionView::Helpers::AssetTagHelper ActionView::Helpers::UrlHelper 模块包含很多方法,它们可让你引用外部资源到当前“模板”中。当然,更通常使用的是link_to(),它创建一个超链接给你的应用程序内的其它“动作”。

<%= link_to "Add Comment", :action => "add_comment" %>

传递给link_to()的第一个参数是用于显示这个链接的文本。下一个是指定链接目标的哈希表。它们的格式与284页中讨论的“控制器”的url_for()方法一样。第三个参数可以用于设置被生成的链接的HTML属性。这个属性支持一个额外的key键,:confirm,它的值是个短消息。如果出现的话,JavaScript将被生成以显示此消息,并在链接之前接受用户的确认。

<%= link_to "Delete", { :controller => "admin",

:action => "delete",

:id => @product

},

{ :class => "redlink",

:confirm => "Are you sure?"

}

%>

button_to()方法工作像link_to()一样,但生成个self-contained窗体的按钮,而不是一个平淡的链接。像我们在32416.9节讨论的,这是链接带有副作用的“动作”的首选方法。尽管这些按钮有它们自己的格式,它有很多重要的约束:它们不能内联,不能出现在其它窗体内。

标签: Rails Web
来源:http://www.cnblogs.com/wengjinbao/articles/651929.html

推荐: