我會解釋我是如何處理這個的。在我的ApplicationController
中,我有一個從每個請求上的before_filter
運行的方法。
def prepare_common_variables
controller_name = self.class.name.gsub(/Controller$/, '')
if !controller_name.index('::').nil?
namespace, controller_name = controller_name.split('::')
end
@default_body_classes = ["#{controller_name.underscore}_#{action_name} ".downcase.strip]
@default_body_classes = ["#{namespace.underscore}_#{@default_body_classes.join}".strip] if !namespace.nil?
end
在app/views/layouts/application.html.erb
我有以下
<body class="<%= yield :body_classes %> <%= @default_body_classes.join(' ') %>">
爲了您StaticPagesController
,則help
動作運行時,這將產生以下<body>
標籤:
接下來,我有一個像我這樣的方法app/assets/javascripts/application.js.erb
Array.prototype.diff = function(a) {
return this.filter(function(i) {return !(a.indexOf(i) > -1);});
};
var DEEFOUR = (function (deefour) {
deefour.Utility = (function (utility) {
utility.hasBodyClass = function() {
var args = Array.prototype.slice.call(arguments);
if (args.length === 0 || $('body').get(0).attr('class') == "") return false;
return args.diff($('body').get(0).attr('class').split(/\s/)).length == 0;
};
return utility;
}(deefour.Utility || {}));
return deefour;
}(DEEFOUR || {}));
最後,我相當於你app/assets/javascripts/static_page.js.coffee
的我都會有這樣的事情
$(function(){
if (!DEEFOUR.Utility.hasBodyClass('static_pages_help')) return;
// code for your help page
});
$(function(){
if (!DEEFOUR.Utility.hasBodyClass('static_pages_about')) return;
// code for your about page
});
這是不錯的,因爲在你看來
<% content_for :body_classes, :some_custom_class %>
或特定行動中
@default_body_classes << "some_other_custom_class"
你可以有條件地添加特定的類來匹配你的Java腳本。
// *both* 'static_pages_help' and 'some_other_class' are required
if (!DEEFOUR.Utility.hasBodyClass('static_pages_help') || !DEEFOUR.Utility.hasBodyClass('some_other_class')) return;
hasBodyClass(...)
接受的參數的任意#;只是列出來。這對於像new
和create
這樣的操作非常有用,您希望在表單未能提交時運行相同的Javascript。
if (!DEEFOUR.Utility.hasBodyClass('some_controller_new', 'some_controller_create')) return;
應該指出,prepare_common_variables
需要一些調整,因爲它僅允許像SomeNamespace::TheController
一個單一命名空間,而不是更像SomeNamespace::AnotherNamespace::TheController
。
如果你選擇2,不要忘記在你的'application.js'中相應的改變'// = require_tree .'行,否則你的控制器特定的文件最終會在每個頁面上加載。 – Felix
謝謝菲利克斯,忘了提及。 – apchester