Как смешивать и вызывать link_to от контроллера в Rails?
Это похоже на вопрос о нобе, но простой ответ ускользает от меня. Мне нужно вызвать link_to
в методе ActionController
, чтобы вытолкнуть ссылку HTML. ActionView::Helpers::UrlHelper.link_to
вызывает url_for
, но это вызывает версию AV-модуля вместо контроллера. Мне удалось заставить это сделать то, что я намеревался, поставив
#FIXME there must be a better way to mixin link_to
alias_method :self_url_for, :url_for
include ActionView::Helpers::UrlHelper
alias_method :url_for, :self_url_for
в контроллере. Но я все еще не уверен, почему это работает. Может ли кто-нибудь объяснить объяснение метода и скрытие происходящего здесь? Какой лучший способ смешать в link_to
(или, вообще говоря, включить только некоторые методы из модуля), поэтому я могу вызвать его в контроллере (генерация флэш-строки со ссылкой является прецедентом.)
Пожалуйста, никаких лекций о MVC - если что, link_to
должно быть в модуле отдельно от url_for
. Судя по количеству шума на этом, многие люди сталкиваются с этой кажущейся тривиальной хваткой и в конечном итоге тратят впустую час, делая это "Rails way", когда действительно то, что нужно, - это минутный взлом, чтобы заставить мое приложение работать сейчас. Есть ли способ "Rails" сделать это с помощью помощников? Или лучший рубиновый путь?
Ответы
Ответ 1
Это на самом деле не отвечает на ваш вопрос, но есть более простой способ
Для Rails 5 используйте прокси helpers
helpers.link_to '...', '...'
Для Rails 3 и 4, так как вы используете помощник из контроллера, вы можете использовать view_context
# in the controller code
view_context.link_to '...', '...'
# instead of using your mixin code
link_to '...', '...'
Для Rails 2, так как вы используете помощник из контроллера, вы можете получить доступ к переменной-члену @template контроллера, @template - это представление, и в нем уже смешан UrlHelper.
# in the controller code
@template.link_to '...', '...'
# instead of using your mixin code
link_to '...', '...'
если вам нужно использовать urlhelper из кода, отличного от контроллера, ваше решение, вероятно, поможет вам
Ответ 2
Совместим с рельсами 3,4 и 5:
view_context.link_to
Ответ 3
Вы можете сделать это следующим образом:
ActionController.helpers.link_to("Click Me!", awesome_path)
Но на самом деле лучшее место для создания этой ссылки может быть в вспомогательном модуле, где уже включены утилиты UrlHelper и другие связанные с просмотром помощники.
[обновление]
Этот подход устарел и больше не работает.
Ответ 4
Я думаю, что самое чистое решение - поместить текст в представление и использовать "render_to_string" из контроллера.
Ответ 5
У меня все еще были проблемы с использованием моих собственных вспомогательных методов, которые используют встроенные вспомогательные методы в контроллере с ActionController.helper.my_method.
Очевидно, что использование render_to_string для каждой вспышки будет работать, но я не хочу создавать так много мелких партитур для каждой вспышки.
Мое решение состояло в том, чтобы создать небольшой помощник для контроллеров для выполнения кода в частичном.
Вспомогательный метод в контроллере:
def h(&block)
render_to_string(:partial => 'helper', :locals => {:block => block})
end
Частично HAML (helper.html.haml):
= instance_eval &block
То же самое будет работать в ERB (helper.html.erb):
<%= instance_eval &block %>
Используйте это как в контроллере для вызова функции my_custom_helper_function, определенной в помощнике:
redirect_to url, :notice => h{my_custom_helper_function}