Класс тела для контроллера в приложении Rails

В настоящее время у меня есть это в моем макете:

<body class="<%= controller.controller_name %>">

Я хочу добавить дополнительный класс, который будет одинаковым для всех действий в любом контроллере, где он установлен, например:

class SomeController < ApplicationController

body_class 'page'

...

end


class AnotherController < ApplicationController

body_class 'page'

...

end

Что приведет к:

<body class="some page">

<body class="another page">

Каким будет самый простой способ добиться этого? Могу ли я использовать для этого переменные класса контроллера?


person Vincent    schedule 29.12.2010    source источник


Ответы (5)


Останавливаться! Останавливаться! Используйте этот шаблон:

<body data-controller="#{controller.controller_path}" data-action="#{controller.action_name}">

Аккуратный! ха?

А затем в вашем document.ready запустите любой сценарий JS, который вы хотите для этой комбинации действий контроллера... (Это может быть автоматически выполнено при готовности документа)

Все кредиты принадлежат: http://viget.com/inspire/extending-paul-irishs-comprehensive-dom-ready-execution

а также:

http://blog.jerodsanto.net/2012/02/a-simple-pattern-to-namespace-and-selectively-execute-certain-bits-of-javascript-взависимостиот-каких-рельсов-controller-and-action-are-active/

person luigi7up    schedule 04.08.2014
comment
Вы забыли экранировать рубиновый код: <body data-controller="<%= controller.controller_path %>" data-action="<%= controller.action_name %>"> - person Sergio D. Márquez; 18.10.2017

Мое решение:

Контроллер:

class SomeController < ApplicationController

  before_filter lambda { @body_class = 'page' }

...

end

Макет:

<body class="<%= "#{controller.controller_name} #{@body_class}".strip %>">
person Vincent    schedule 30.12.2010

Первое, что приходит на ум, это макет для этого контроллера. Второе, что приходит на ум, это помощник, который проверяет URL и возвращает соответствующий HTML.

class YourController < ApplicationController
layout "new_layout"
 #...
end
person Scott Radcliff    schedule 29.12.2010

Я использовал способ @vincent. Поскольку я использую Rails 5.2.0, before_filter устарел и был заменен на before_action. Я сделал небольшое изменение.

контроллер:

class SomeController < ApplicationController
    before_action do 
        @body_class = 'page'
    end

    ...

end

макет:

<body class="<%= "#{controller.controller_name} #{@body_class}".strip %>">
person Eventhisone    schedule 05.02.2019

person    schedule
comment
Пожалуйста, не делайте дамп кода. Дайте объяснение того, что вы сделали. - person arco444; 31.03.2015