Подтвердить что ты не робот

Как смешивать и вызывать 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" сделать это с помощью помощников? Или лучший рубиновый путь?

4b9b3361

Ответ 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}