Как я могу использовать content_for - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь создать динамический заголовок страницы. Это больше, чем просто @ project.title

Название проекта в заголовке страницы содержит много элементов, таких как название проекта, категория проекта и город проекта.

Я пробовал это

<%= content_for :page_title @project.name, @project.category, @project.city %>

<%= content_for :meta_description, @project.description %>

Но я получаю ошибку вроде этой

syntax error, unexpected keyword_ensure, expecting ')'

Я также пытался

<%= content_for (:page_title @project.name, @project.category, @project.city) %>

что привело к той же ошибке: syntax error, unexpected keyword_ensure, expecting ')'

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

По сути, это просто синтаксическая ошибка. Если вы хотите сохранить блок, вы используете <% content_for :page_title, "My title" %>. Только если вы хотите повторно использовать этот блок, вы должны добавить = после открывающего тега.

В соответствии с документацией вы можете передать только один content параметр. Таким образом, вы должны выполнить конкатенацию самостоятельно.

<% content_for :page_title, "#{@project.name} #{@project.category} #{@project.city}" %>

Документацию для помощника content_for можно найти здесь .

1 голос
/ 16 октября 2019

быстрый ответ

Может быть, просто попробуйте это в вашем представлении проекта

<% content_for :page_title, "#{@project.name} #{@project.category} #{@project.city}" %>

tl; dr

content_for сохраняет бит кода в идентификаторе. Чтобы получить доступ к этому сохраненному контенту позже, вы должны передать идентификатор в качестве аргумента content_for. Примечание: yield по-прежнему может использоваться для извлечения сохраненного содержимого.

Иными словами, метод content_for позволяет вставлять содержимое в именованный блок yield в макете.

дляпример

Если ваш текущий макет содержит yield(:title) ...

<!-- app/views/layouts/application.html.erb -->
<html>
<head>
</head>
<body>
  <div id="title"><%= content_for?(:title) ? yield(:title) : "No title block!" %></div>
  <div id="main"><%= yield %></div>
</body>
</html>

Затем вы можете вставить заголовок из вида, подобного этому

<!-- app/views/projects/index.html.erb -->
<% content_for :head do %>
 "#{@project.name} #{@project.category} #{@project.city}"
<% end %>

См .:https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for и https://rubyplus.com/articles/3081-Layouts-and-Content-For-Tag-in-Rails-5

Чтобы ответить на ваш вопрос. Полученные сообщения об ошибках говорят о том, что ваш код Ruby синтаксически неверен. В идиоматическом ruby ​​всегда неправильно вызывать функции так, как вы нам показали. Параметры всегда должны вызываться индивидуально, разделенные запятой:

# wrong code, wrong syntax
<%= content_for :page_title @project.name, @project.category, @project.city %>
# wrong code, right *right syntax*
<%= content_for :page_title, @project.name, @project.category, @project.city %>

Также, как указано в ответе Робина, документы для content_for показывают, что вы можете передать толькоодин параметр содержимого. Таким образом, вы должны сделать объединение самостоятельно.

<% content_for :page_title, "#{@project.name} #{@project.category} #{@project.city}" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...