Как смешать и вызвать link_to из контроллера в Rails? - PullRequest
50 голосов
/ 02 октября 2010

Это похоже на нубский вопрос, но простой ответ ускользает от меня.Мне нужно вызвать 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», когда на самом деле то, что нужно, - это минутная попытка заставить мое приложение работать сейчас.Есть ли способ Rails сделать это с помощниками, возможно?Или лучший рубиновый способ?

Ответы [ 4 ]

114 голосов
/ 19 июня 2012

Совместимо с рельсами 3,4 и 5:

view_context.link_to
60 голосов
/ 02 октября 2010

Это на самом деле не отвечает на ваш вопрос, но есть более простой способ

Для 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из кода, отличного от контроллера, ваше решение, вероятно, является подходящим вариантом

1 голос
/ 18 мая 2011

Вы можете сделать это следующим образом:

ActionController.helpers.link_to("Click Me!", awesome_path)

Но на самом деле, лучшее место для генерации этой ссылки может быть вспомогательный модуль, где UrlHelper и другие помощники, связанные с представлением уже включены.

[обновление]

Этот подход устарел и больше не работает.

0 голосов
/ 13 января 2012

У меня все еще были проблемы с использованием моих собственных вспомогательных методов, которые используют встроенные вспомогательные методы в контроллере с 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_, определенной в помощнике:

redirect_to url, :notice => h{my_custom_helper_function}
...