render не знает, где искать партиалы (из вспомогательного кода)

Когда я пытаюсь отрендерить партиал из помощника, происходит сбой с этим (сжатым) сообщением об ошибке:

Missing partial /_cube_icon with [...]. Searched in:

Обратите внимание, что список искомых каталогов пуст!

Напротив, при использовании рендеринга в представлении он знает, где искать:

Searched in:  * "/Users/Lars/GitHub/algdb/app/views"

Во вспомогательном коде я использую ActionController::Base.helpers.render(). Должен ли я использовать какую-то другую функцию рендеринга? Как мне сказать ему, где искать партиалы? Мог ли я как-то неправильно настроить проект?

Это Rails 4.2.4 · Ruby 2.3.1


person Lars P    schedule 14.12.2016    source источник


Ответы (2)


Хорошо, я понял:

Я вызывал render из кода в вспомогательном каталоге, но не из функции в стандартном модуле SomethingHelper.

Следуя этому соглашению, все начало работать.

person Lars P    schedule 14.12.2016
comment
Я рад, что ты понял это. Я обновил свой ответ, но если вы поняли это хорошо для вас. - person Dan Rubio; 14.12.2016

Частичные файлы обычно находятся в каталоге app/views, а не в каталоге helpers в Rails, как видно из полученного вами сообщения об ошибке. Чтобы решить вашу проблему, я бы переместил файл _cube_icon в каталог app/views и организовал там ваш код. Я рекомендую прочитать этот раздел документации Rails для представлений Макеты и рендеринг

Кроме того, похоже, что вы можете быть новичком в рельсах, поэтому я хотел бы взглянуть на соглашения, которые предлагает рельсы. Rails, как вы можете знать или не знать, является самоуверенным фреймворком, что означает, что определенные вещи должны находиться в определенных местах, чтобы он работал. Вот еще один ресурс, посвященный только представлению фреймворка Rail MVC Обзор просмотра действий. Надеюсь это поможет.

---Обновлено-----

Если вы действительно хотите визуализировать частичный файл из вспомогательного файла, есть несколько способов сделать это, но лучший из них описан ниже:

In app/helpers

 module MyHelper
   def custom_render
     concat(render(:partial => 'cube_icon'))
   end
 end

Вот несколько ссылок из stackoverflow, которые помогут вам.

Визуализация партиала из помощника №1

Визуализация партиала от herlper #2

Использование concat rails

person Dan Rubio    schedule 14.12.2016
comment
Спасибо за ответ! Частичный находится в app/views и отлично отображается из представления. Моя проблема заключается в попытке отобразить один и тот же частичный код из вспомогательного кода. - person Lars P; 14.12.2016
comment
Итак, позвольте мне спросить вас об этом. Чего вы пытаетесь добиться с помощью кода? То, что вы пытаетесь сделать, чтобы отобразить частично из каталога app/helpers, неверно. Вспомогательный каталог предназначен не для рендеринга частичных файлов. Эта ответственность ложится на каталог app/views. Помощники используются для извлечения логики представления (например, цикла if/else .each), чтобы сделать представления более чистыми. Может быть, если вы можете уточнить больше, я могу помочь вам. Я действительно думаю, что вы можете подойти к этому неправильно. - person Dan Rubio; 14.12.2016
comment
Просто в дополнение к моему комментарию вот прямая цитата из пункта учебника: "The helpers subdirectory holds any helper classes used to assist the model, view, and controller classes. This helps to keep the model, view, and controller code small, focused, and uncluttered." - person Dan Rubio; 14.12.2016
comment
Я думаю, вы можете неправильно понять вопрос. Партиал находится в app/views/positions/_cube_icon.html.haml, как и должно быть. Что находится в хелпере, так это код: ActionController::Base.helpers.render partial: 'cube_icon' Я никогда раньше не рендерил партиалы из хелперов, но поиск в гугле показывает много примеров того, как люди успешно это делают. - person Lars P; 14.12.2016