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

563   4  

4 ответов:

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

Для 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 из кода, отличного от контроллер, вероятно, ваше решение-это путь

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

view_context.link_to

Вы можете сделать это так:

ActionController.helpers.link_to("Click Me!", awesome_path)
Но на самом деле, лучшим местом для создания этой ссылки может быть вспомогательный модуль, в который уже включены UrlHelper и другие помощники, связанные с представлением.

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

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

У меня все еще были проблемы с использованием моих собственных вспомогательных методов, которые используют встроенные вспомогательные методы в контроллере с ActionController. helper. my_method.

Очевидно, что использование render_to_string для каждой вспышки будет работать, но я не хочу создавать так много маленьких партиалов для каждой вспышки.

Моим решением было создать небольшой помощник для контроллеров для выполнения кода в частичном виде.

Вспомогательный метод в контроллере:

def h(&block)
  render_to_string(:partial => 'helper', :locals => {:block => block})
end

Частичный ГАМЛ (помощник.формат 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}

Comments

    Ничего не найдено.