Использование помощников (или рендеринг партиалов) из пользовательских тегов RedCloth
Я пытаюсь вызвать помощника вида из пользовательского тега RedCloth, и мне совсем не везет. Все примеры, которые я могу найти, имеют собственный метод тэга, создающий и возвращающий литеральную строку без вызова какого-либо другого метода вообще.
Я пытаюсь создать собственный тег RedCloth для вывода еженедельного расписания; код, для которого уже был написан помощник, поскольку он также используется в других областях приложения.
Итак, вот (значительно сокращенный) код, к которому сводится моя проблема:
приложение / просмотров / страница / show.html.erb:
<%= raw redcloth @page.content %
приложение / хелперы / pages_helper.rb:
module PagesHelper
def redcloth(content)
r = RedCloth.new content
r.extend ScheduleTag
r.to_html
end
end
приложение / хелперы / schedule_tag.rb:
module ScheduleTag
include ScheduleHelper
def schedule(options)
build_schedule
end
end
приложение / хелперы / schedule_helper.rb:
module ScheduleHelper
def build_schedule
content_tag :div do
content_tag :span,
"Why won't my helper just work by magic like the rest of " \
"rails seems to?"
end
end
end
При выполнении, рельсы утверждают следующее:
TypeError in Pages#show
Showing /blah/blah/blah/app/views/pages/show.html.erb where line #1 raised:
can't convert Symbol into Integer
Extracted source (around line #1):
1: <%= raw redcloth @page.content %>
Rails.root: /blah/blah/blah
Application Trace | Framework Trace | Full Trace
app/helpers/schedule_helper.rb:3:in `build_schedule'
app/helpers/schedule_tag.rb:42:in `schedule'
app/helpers/pages_helper.rb:22:in `redcloth'
app/views/pages/show.html.erb:1:in _app_views_pages_show_html_erb___756530284_81829440__535015588'
app/controllers/pages_controller.rb:23:in `show'
Я могу добиться небольшого прогресса, перейдя от использования помощника к классу, но у этого класса все еще возникают проблемы с использованием стандартных помощников:
/app/helpers/schedule_builder.rb:
class ScheduleBuilder
extend ActionView::Helpers::TagHelper
def self.build_schedule
content_tag :div do
content_tag :span,
"Why won't my helper just work by magic like the rest of " \
"rails seems to?"
end
end
end
И рельсы говорят:
NoMethodError in Pages#show
Showing /blah/blah/blah/app/views/pages/show.html.erb where line #1 raised:
undefined method `output_buffer=' for ScheduleBuilder:Class
Extracted source (around line #1):
1: <%= raw redcloth @page.content %>
Rails.root: /blah/blah/blah
Application Trace | Framework Trace | Full Trace
app/helpers/schedule_builder.rb:5:in `build_schedule'
app/helpers/schedule_tag.rb:42:in `schedule'
app/helpers/pages_helper.rb:22:in `redcloth'
app/views/pages/show.html.erb:1:in `_app_views_pages_show_html_erb___756530284_81708830__535015588'
app/controllers/pages_controller.rb:23:in `show'
Так что мне делать? Я скучаю по чему-то совершенно очевидному, и мне следовало бы стыдиться своей головы, или же просто невозможно вызвать помощников откуда-либо, кого они воображают? Нужно ли мне просто смириться с этим и заставить собственный тег дублировать весь код в моем модуле ScheduleHelper?
Любая помощь будет принята с благодарностью.
1 ответ
Итак, я сам пришел к приемлемому решению. Так что я буду хорошим маленьким мальчиком и поделюсь.
Вместо помощника я собираюсь использовать класс, который визуализирует частичное, поэтому на самом деле должен возникнуть вопрос: "Вызов частичных элементов из пользовательских тегов RedCloth".
(Я не прокомментировал код, он должен быть самодокументированным)
приложение / хелперы /schedule_tag.rb:
module ScheduleTag
def schedule(options)
Schedule.new.render Date.today.monday
end
end
приложение / хелперы /schedule.rb:
class Schedule < ActionView::Base
include ActionView::Helpers::TagHelper
include Rails.application.routes.url_helpers
def render week
self.view_paths = "app/views"
super :partial => "schedule/schedule",
:locals => { :week => week,
:schedule => ScheduledClass.get_schedule(week) }
end
end
приложение / просмотр / график /_schedule.html.erb:
<table id="schedule">
<tbody>
<tr>
<td>Hoop-dee-doo, it works!</td>
<%= content_tag :td do %>
<%= link_to "so do tag & route helpers", happy_monkey_path(:happy => "very") %>
<% end %>
</tr>
</tbody>
</table>
Немного в стороне, если вы попробуете это, вы можете наткнуться на проблему, когда RedCloth избегает строки параметров. Просто заключите варианты в ==
чтобы получить возможность буквально пройти через все варианты. например schedule. =={"weeks":["this","next"]}==
, Это может быть немного опасно, так что не забудьте проверить на неприятность.