2009年10月12日,星期一

Edge Rails 的新功能

作者:Nathaniel Bibler

Edge Rails 仍在稳步前进。一直以来都有新的、有趣的修复、更改和重构在进行中。所以,让我们来看看自上次发布以来的一些更新吧(我知道,已经很久了,我很抱歉!)。

ActionView 和 Helpers

XSS 转义现在默认启用。这意味着,如果您想在视图中显式输出 HTML,您可能需要先将其标记为html_safe!然后再发送。

<%= 'my <a href="http://www.rubyonrails.org">safe</a> string'.html_safe! %>

许多内置的 helpers 都已针对此更改进行了更新,如果您发现 Rails helpers 被错误地清理,您应该创建一个新的 ticket。

在 Jay Pignata 和 John Trupiano 的贡献下,distance_of_time_in_words 增加了“over”、“about”和“almost”关键字。这为您提供了更高的近似时间流逝程度的粒度。所以,不再仅仅是“2年前”,它现在还可以报告“几乎2年前”、“大约2年前”和“超过2年前”,具体取决于与刚好2年前的接近程度。

assert_equal "almost 2 years",  distance_of_time_in_words(from, to + 2.years - 3.months + 1.day)
assert_equal "about 2 years",   distance_of_time_in_words(from, to + 2.years + 3.months - 1.day)
assert_equal "over 2 years",    distance_of_time_in_words(from, to + 2.years + 3.months + 1.day)
assert_equal "over 2 years",    distance_of_time_in_words(from, to + 2.years + 9.months - 1.day)
assert_equal "almost 3 years",  distance_of_time_in_words(from, to + 2.years + 9.months + 1.day)

HTML 表单 helper,fields_for - 通常用于嵌套额外的模型表单 - 现在允许使用显式集合,这得益于 Andrew France。因此,您应该只显示已发布的 blog.posts,而不是所有 blog.posts。或者

<% form_for @person, :url => { :action => "update" } do |person_form| %>
  ...
  <% person_form.fields_for :projects, @active_projects do |project_fields| %>
    Name: <%= project_fields.text_field :name %>
  <% end %>
<% end %>

API 更改:对于 content_tag_for:第三个参数 - 即可选的 CSS 前缀 - 现在也将影响生成的 CSS 类。此前缀现在将附加到生成的元素的 CLASS 属性。

<%= content_tag_for(:li, @post, :published) %>
# => <li id="published_post_123" class="published_post">...</li>

ActiveResource 和 ActiveRecord

Taryn East 已向 ActiveResource 添加了 update_attribute(s) 方法。这些方法与我们已经熟悉和喜爱的 ActiveRecord 方法非常相似。

通过包含条件的 has_one 关联来构建或创建对象现在将自动将这些条件附加到新创建的对象,这得益于 Luciano Panaro。

class Blog
  has_author :commit_author, :class_name => 'Author', :conditions => {:name => "Luciano Panaro"}
end

@blog.build_commit_author
# => #<Author name: "Luciano Panaro" ... >

Pratik Naik 为 ActiveRecord 的 accepts_nested_attributes_for 添加了一个新选项,以:limit 限制允许处理的记录数量。此外,在讨论 accepts_nested_attributes_for 时,José Valim 将 _delete 选项重命名_destroy,以更好地遵循实际发生的行为。目前,已为 _delete 添加了弃用警告。

Jacob Burkhart 更新了 Rails 2.3 中的新 autosave 选项,以允许 :autosave => false,这将阻止保存关联对象,即使它们是 new_record?

一些内部实现

以前,将 XML 转换为 Hash 时可能会忽略 CDATA 元素,现在,得益于 John Pignata,Hash#from_xml正确解析并包含 CDATA 元素的值。

Josh Peek 已将全局异常处理迁移到 ActionDispatch::Rescue。所以,这现在在 Rack 中间件层面进行处理。

最后,Yehuda Katz 和 Carl Lerche 开始着手开发 Rails::Application 对象,以更好地封装应用程序启动和配置的详细信息。此外,大量的初始化工作已移入这个新对象。

请记住,如果您更喜欢对此类内容进行简短的音频摘要,可以收听 Envy Labs 的 Ruby5 播客;它每周二和周五发布,包含 Ruby 和 Rails 社区的最新消息。

照片:Brian Taylor 的 钟楼