2012-02-25 39 views
3

是否可以操作占位符,以便我不仅可以设置其内容,还可以按特定顺序添加/删除内容?例如:Rails 3嵌套布局:如何在最后添加?

布局/ base.html.erb(碱布局意味着被延长):

<!DOCTYPE html> 
<html> 
    <head> 
    <title><%= yield :title %></title> 
    <%= yield :stylesheets %> 
    <%= yield :javascripts %> 
    <%= yield :csrf %> 
    </head> 
    <body> 

    <div class='container-fluid'> 
     <%= yield :header %> 

     <%= content_for?(:content) ? yield(:content) : yield %> 

     <%= yield :footer %> 
    </div> 
    </body> 
</html> 

布局/ application.html.erb(这是我将使用为最布局我的应用程序的一部分,它从基地布局继承):

<% content_for :stylesheets do %> 
    <%= stylesheet_link_tag "application", :media => "all" %> 
<% end %> 

<% content_for :javascripts do %> 
    <%= javascript_include_tag "application" %> 
<% end %> 

<% content_for :csrf do %> 
    <%= csrf_meta_tags %> 
<% end %> 

<%= render :template => 'layouts/base' %> 

现在我要为特定的控制器,这可能需要增加更多的JavaScript链接,或者可能完全删除它们的布局。假设我想在之后的其他javascripts中只添加一个文件。到目前为止,我得到这个:

布局/ some_controller.html.erb(这是一个特定的控制器的布局,它应该从应用程序布局继承):

<% content_for :javascripts do %> 
    <script src="/assets/some_javascript_that_depends_on_jquery.js" type="text/javascript"></script> 
<% end %> 

<%= render :template => 'layouts/application' %> 

这是行不通的,因为它会将some_javascript_that_depends_on_jquery.js放置在:javascripts占位符的开头,我最终需要它,因为它取决于jquery。

直接扩展基本布局并跟踪对应用布局所做的任何更改以将其应用于控制器特定的布局也是非常困难的。

建议如何处理这种情况?

+0

我可能只是将控制器javascripts重命名为local_javascripts,并在基地中产生,但我想这就是你想要避免的。 (或者local_header也许?我发现自己也想有时间使用“本地”样式表。) – froderik 2012-02-25 07:39:10

+0

@froderik这样做会工作,但感觉不对,并且一旦我需要更多控制器特定的布局。 – HappyDeveloper 2012-02-25 07:50:49

回答

0

这不能作为其他框架,你只延长布局,然后在将修改继承块来完成。

Rails强迫你保持简单。

0

在application.html.erb,保持content_for的内容:JavaScript的一个部分

这里的局部将有 <%= javascript_include_tag “应用程序” %>

然后,调用相同的部分另外还有其他布局中的其他javascript。

的另一种方式,

可以调用一个帮手这将有一个这样的哈希: js_files = { “application_controller”=> [ “js_file_1”], “some_controller”=> [ “js_file_1”,” js_file_2“]}

现在,获取js文件并在基于内容中的控制器的运行时构建javascript include标记。

希望这会更灵活。 对不起格式。

+0

难道不会两次添加应用程序的JavaScript? – HappyDeveloper 2012-02-25 07:44:03

+0

请看第二种方式(编辑)。希望这会有所帮助。 – asitmoharna 2012-02-25 07:54:45

+0

感谢您的尝试,但第二种方式只适用于可修复的东西。我需要能够添加各种内容,js标签只是一个例子。 – HappyDeveloper 2012-02-25 08:05:45

0

每个控制器始终保留一个js文件。

<%= javascript_include_tag params[:controller] %> 

让我们示例users控制器的话,会有users.js.coffee文件。

如果你想有多个JS文件的用户控制器,那么你可以要求users.js.coffee文件

六users.js里面的文件。咖啡

//= require 'a' 
//= require 'b' 

/* my extra js code will go here */