私はこれをどのように処理するかを説明します。私には、リクエストごとに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
な単一の名前空間のみを許可するため、少し調整する必要があることに注意してください。SomeNamespace::TheController
SomeNamespace::AnotherNamespace::TheController