2011-01-12 2 views
4

Я пытаюсь создать вспомогательную функцию (например, в application_helper.rb), которая генерирует link_to на основе параметров, переданных вспомогательной функции. Если бы я поставить ссылку в Еврорадио файл, он будет иметь формат:Rails view Вспомогательная функция и функция link_to

<%= link_to 'Some Text', { :controller => 'a_controller', :action => 'an_action' } %> 

В функции помощника, Текст, контроллер и действие все прошло или рассчитаны. Код в функции хелпера:

params = "{ :controller => '#{controller}', :action => '#{action_to_take}'}" 
html = "#{link_to some_text, params }<p />" 
return html 

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

Как я могу получить строку params для оценки (как в файле ERB)?

+0

Где строка PARAMS исходя из что вы хотите оценить? –

ответ

10

Я думаю, что у вас есть вещи сложнее в вашей голове. Если вы не пытаетесь сделать что-то очень странное (и нецелесообразное) это будет работать:

def link_helper text, controller, action 
    link_to text, :controller => controller, :action => action 
end 

Хотя, как вы можете видеть, что это не стоит того, что делает его помощник - это едва ли более простая, чем функциональность этого обертывания, и гораздо менее гибкими.

Помощник link_to возвращает строку, так что это очень простой в использовании, как вы хотите:

def link_helper text 
    # some helper logic: 
    controller = @controller || "pages" 
    action  = @action  || "index" 

    # create the html string: 
    html = "A link to the #{controller}##{action} action:" 
    html << link_to(text, :controller => controller, :action => action) 
    html # ruby does not require explicit returns 
end 
+0

Спасибо. Это работает, если все, что мне нужно было сделать, это вернуть ссылку_то, но я отредактировал метод до публикации. Link_to - это последняя часть более крупного фрагмента HTML, созданного помощником, поэтому я добавляю его в переменную HTML. Также значения контроллера и действия изменяются в зависимости от другой логики в помощнике. – Paul

+0

OKay, я обновил пример того, как это звучит, как вы хотите. – gunn

+0

Отлично, спасибо. – Paul

0

Вы могли бы просто использовать url_for помощника.

link_to "Some Text", url_for (: действие =>: action_name,: контроллер =>: controller_name)

+0

Вы, конечно, могли бы это сделать, но было бы бессмысленно - link_to вызывает url_for внутри, поэтому эта функция идентична 'link_to" Some Text ",: action =>: action_name,: controller =>: имя_контроллера' – gunn

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