Динамический идентификатор тела - PullRequest
7 голосов
/ 15 апреля 2011

Как мне установить идентификатор для тега body в Rails?

<body id="login">

Ответы [ 7 ]

25 голосов
/ 10 сентября 2012

Я не считаю ни одно из решений особенно элегантным или гибким. Добавьте метод body_class в application_helper.rb :

  def body_class
    [controller_name, action_name].join('-')
  end

.. в макете:

<body class="<%= body_class %>">
#e.g output: <body class="articles-show">

Затем вы можете уточнить вышеупомянутый помощник для динамического внедрения других идентификаторов, таких как модули.

5 голосов
/ 15 апреля 2011

Вы должны использовать тег content_for здесь.

В макете вашего приложения:

<html>
...
<%= yield :body || "<body>" %>
...
</body>
</html>

И тогда из любого представления вы можете вызвать это:

<% content_for :body do %>
  <body id='login'>
<% end %>

Этоэто:)

3 голосов
/ 15 апреля 2011

Вы можете установить переменную @body_id в своем действии внутри контроллера или в своем представлении, и вы можете использовать ее в своем макете.

Так, например, если у вас есть действие index Вы можете добавить этот код в свой контроллер:

def index
  @body_id = "myid"
end

или в вашем представлении index.html.erb как:

<% @body_id = "myid" %>

Затем в вашем макете я предполагаю application.html.erbВы можете добавить:

<body<%= " id=#{@body_id}" if @body_id %>>    # no quotes around #{} are needed ;)
2 голосов
/ 01 марта 2013

Будьте осторожны, вы не должны настраивать просмотр данных в своих контроллерах, как рекомендовали некоторые из приведенных выше постов. Он нарушает шаблон MVC и создает ненужные объекты, которые не будут использоваться нигде, кроме HTML-версий ваших страниц.

Еще одна вещь, о которой следует помнить, это повышенный риск при назначении тега body внутри логического блока - зачем рисковать, когда страница не выводит тег body (ломая страницу), если вам это не нужно? Пример выше:

<%= yield :body || "<body>" %>

Кто-то, возможно, не совсем понимает ваше значение в дочерней части, и вы просто увеличиваете дублирование тега body, что означает, что у вас есть больше мест для поиска, если кто-то не завершает тег, и т. Д. Нет необходимости этот риск. Более разумное решение - уступить только классу. HAML позволит вам предоставлять дополнительные элементы класса, например:

%body{ id: yield(:body_id), class: yield(:body_class) }

И затем установите эти значения в вашем представлении:

- content_for(:body_class) { 'dashboard business' }

Мне бы понравилось решение, позволяющее нескольким частям добавлять классы в один блок yield, но пока не нашло нехакерского способа сделать это.

2 голосов
/ 22 сентября 2011

Будь осторожен!Следующее не будет работать в рельсах 3.1

<%= yield :body || "<body>" %>

Может показаться, что все работает, но если вы посмотрите исходный код, вы заметите, что ваш тег body отсутствует, если вы его не переопределите.Большинство браузеров работают с отсутствующим тегом body.

Правильный способ сделать это следующим образом:

<%= content_for?(:body) ? yield(:body) : raw("<body>") %>
0 голосов
/ 15 апреля 2011
<body id="<%= @bodyid %>">

и в вашем контроллере вы можете установить это

@bodyid = "login"
0 голосов
/ 15 апреля 2011

U на самом деле не объяснил, что именно вам нужно делать, мое первое предположение:

<body id="<%= @body_id %>">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...