我将解释我如何处理这个问题。在我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>
标记:
<body class="static_pages_help">
接下来,我有一个这样的方法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"
您可以有条件地添加特定的类以在您的 Javascript 中进行匹配。
// *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(...)
接受任意数量的参数;把它们列出来。这对于当表单提交失败时您希望运行相同的 Javascript 之new
类的事情很有用。create
if (!DEEFOUR.Utility.hasBodyClass('some_controller_new', 'some_controller_create')) return;
应该注意的是,prepare_common_variables
需要进行一些调整,因为它只允许单个命名空间 likeSomeNamespace::TheController
而不是更多 like SomeNamespace::AnotherNamespace::TheController
。