#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. Я никак не могу это сделать?