содержимое, которое не отображается при установке в макете для извлечения в режиме действия

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

Прежде всего, я использую Rails 3.1.1 и Ruby 1.9.3-p0 . После нескольких часов экспериментов с моим существующим проектом и новым проектом «проверка работоспособности» я могу подтвердить, что это, похоже, не работает. Я пробовал как в HAML, так и в ERB, но вот версия HAML. Сначала файл layout:

 / application.html.haml
- content_for :stuff, "some content"
#content
  = yield  # lets say we are in the show action
  

За которым следует режим action view:

 / show.html.haml
= content_for :stuff
  

В результате ничего не отображается. Я надеюсь, что я, конечно, крайне неправ, потому что мне действительно нужно иметь возможность это делать, и похоже, что это один из тех распространенных сценариев. Должно ли это работать или нет? Если нет, могу ли я получить предложение о хорошей альтернативе? Спасибо!

Комментарии:

1. Я не знаю, связана ли ваша проблема с версией ruby, но 1.9.3 не является поддерживаемой версией, и вам следует избегать ее.

2. @PauloAbreu я думаю, что людей активно поощряют запускать материал на 1.9.3. Я уверен, что Rails полностью поддерживается на 1.9.x. Возможно, поддержка 1.9.1 может быть прекращена в ближайшем будущем. Несмотря на это, проблема в данном конкретном случае не связана с версией ruby.

3. @AdityaSanghi На веб-сайте Ruby on Rails очень четко указано, что такое 1.9.1: не поддерживается ( rubyonrails.org/download ). Но из-за природы Rails возможно, что эта информация устарела.

4. Представление Action отображается перед макетом. Можете ли вы объяснить ваше требование, пожалуйста? Я уверен, что есть простой ответ

Ответ №1:

Я не знаю HALM, но, похоже, вы инвертируете правильный порядок.

Вы определяете content_for в своем макете (application.html.erb)

 <%= content_for :something if a_test %>
  

И что следует заменить на, по вашему мнению

 <% content_for :something do %>
  Hello World
<% end %>
  

Комментарии:

1. Это не инвертировано, потому что я хочу отобразить свой content_for в action view, а не в layout. Скорее, я хочу установить свой content_for в layout и отобразить его в action view.

Ответ №2:

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

Комментарии:

1. Я действительно не понимаю вашего требования. Зачем вам нужно определять содержимое для представления в его макете?

Ответ №3:

Я думаю, вы просто ошиблись. Вот исправленный код с некоторым объяснением:

 / application.html.haml
#content
  = yield(:stuff)  # lets say we are in the show action

/ show.html.haml
- content_for :stuff do
  = "Some content with #{some.computation}"
  

Что я изменил:

  • В вашем application.html.haml вы должны указать структуру, а затем обозначить содержимое. Это делается yield(:stuff) .
  • В вашем файле show.html.haml вы определяете, что такое содержимое stuff . Обычно это делается с помощью блока, но может быть выполнено следующим образом: - content_for :stuff, "My content" .

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

  • Определите содержимое чего-либо в application.html.haml файле.
  • Используйте это содержимое только в некоторых файлах view (в примере show.html.haml для одного контроллера).

Во-первых, я не понимаю, зачем вам делать что-то подобное. И, во-вторых, да, представления отображаются первыми. Единственный вариант, который у вас есть, это включить определение и использование в ваш application.html.haml файл таким образом:

 / application.html.haml
- content_for :stuff, "some content"
#content
  = yield(:stuff) if controller.action_name == 'show'
  

Комментарии:

1. это правильный ответ. Используйте yield (:stuff) для вывода содержимого и content_for:stuff { } для отправки содержимого.

2. Спасибо за ответ, однако это не та функциональность, которую я хочу. Я хочу иметь возможность устанавливать content_for в файле макета приложения, а не в action view. Я никак не могу это сделать?