быстрый ответ
Может быть, просто попробуйте это в вашем представлении проекта
<% 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}" %>