2010-10-01 4 views
45

Это похоже на вопрос о нобе, но простой ответ ускользает от меня. Мне нужно позвонить link_to в методе ActionController, чтобы выслать ссылку HTML. ActionView::Helpers::UrlHelper.link_to вызывает url_for, но это вызывает версию AV-модуля вместо контроллера. Мне удалось заставить это сделать то, что я намеревался, поставивКак смешивать и вызывать link_to от контроллера в Rails?

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

ответ

50

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

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

+0

ок спасибо, что будет работать. – tribalvibes

+5

@template для меня в моем контроллере. Любая идея почему? –

+0

@TylerCollier - возможно, это изменилось с помощью рельсов 3? он работал над 2 – house9

1

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

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

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

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

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

+1

Я читал этот дневник 'self.class.helpers.link_to' (http://blog.lrdesign.com/2009/ 05/using-link_to-or-other-helper-methods-in-a-controller /), но «ActionController.helpers.link_to» должен быть одним и тем же. –

+4

'undefined method 'helpers' для ActionController: Module' @ Rails 3.2 – Nowaker

+0

Если этот ответ больше не действителен, его, вероятно, следует удалить или, по крайней мере, включить номер последней версии Rails, в котором он работал. – James

0

Я думаю, что самое чистое решение - положить текст в представление и использовать «render_to_string» изнутри контроллера.

0

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

Совместимость с Rails 3 и 4:

view_context.link_to 
+7

Это должно быть теперь как правильный ответ. Он совместим с Rails 4, а также – hoitomt

+1

Я обновил проверенный ответ для вас –

+0

, а что же html_safe для этой структуры? Можете ли вы дать ответ на это? Благодаря :) –

 Смежные вопросы

  • Нет связанных вопросов^_^