Rails global content_for

时间:2010-02-23 14:23:19

标签: ruby-on-rails optimization helpers content-for

示例:

我有2个部分_map.haml和_bigmap.haml。

:: _map.haml

- content_for :map do
  %script{:type => "text/javascript", :src => "http://maps.google.com/maps/api/js?sensor=true"}
  ...

:: _bigmap.haml

- content_for :bigmap do
  %script{:type => "text/javascript", :src => "http://maps.google.com/maps/api/js?sensor=true"}
  ...

在我的布局中,我将javascripts包含在

= yield(:map)
= yield(:bigmap)

问题1: 这意味着谷歌图书馆将被包括两次。我怎么能处理这个,所以库总是只加载一次? A想到看见heler可能吗?

问题2: 是否可以拥有一个全局content_for字段,其中每个部分都将其内容附加到其中? THX。

1 个答案:

答案 0 :(得分:4)

您可以在应用程序助手中添加inject_js方法,以便在视图中使用:

def inject_js
  @javascripts.uniq.collect{ |js|
    javascript_include_tag js
  }.join("\n")
end

然后在您的应用程序视图中:

%html
  %head
  ...
  = inject_js

并且在任何使用bigmap的视图中:

- @javascripts << 'http://maps.google.com/maps/api/js?sensor=true'
- @javascripts << 'bigmap'

或常规地图:

- @javascripts << 'http://maps.google.com/maps/api/js?sensor=true'
- @javascripts << 'bigmap'

由于inject_js使用@javascripts.uniq,因此Google库只会加载一次。

来自tog's tog_core

inject_js代码。还有其他方法(inject_css等)。