Как я могу вернуть javascript из вспомогательного метода Ruby on Rails? - PullRequest
3 голосов
/ 22 июля 2010

У меня есть модель заметки, которая может содержать прикрепленную ссылку на изображение (linktype = "image") или какой-либо текст (linktype = "text). Когда я отображаю заметки, метод отображения меняется в зависимости от типа ссылки.Например:

<% @notes.each do |q| %>
    <h2 class="title"><%= q.name %></h2>
    <% if q.linktype == "other"%>
        <script type="text/javascript">some javascript</script>
    <% elsif q.linktype == "text"%>
        <%= q.text %>
    <% elsif q.linktype == "image"%>
       <img src="<%= q.link %>" />
    <% end %>
<% end %>

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

Моя первоначальная мысль заключалась в том, чтобы поместить код дисплея в помощник, что-то вроде этого:

<% @notes.each do |q| %>
    note_display(q.linktype, q.link)
<% end %>

Но некоторые из них связаны с использованием JavaScript (строка 4 в началеБлок кода). Могу ли я по-прежнему использовать вспомогательный метод, даже если он мне понадобится для возврата javascript? Если да, то как мне это сделать? Спасибо за чтение.

Ответы [ 2 ]

10 голосов
/ 22 июля 2010

В javascript нет ничего особенного, вы можете вернуть его от помощников, как если бы вы возвращали другой HTML-контент.Единственное, что я хотел бы предложить, это использовать помощники для тегов, таких как

image_tag(q.link)
javascript_tag("some javascript")
content_tag("h2", q.name, :class => "title")
3 голосов
/ 22 июля 2010

Что касается ERB, JavaScript - это просто строковое содержимое, как и все остальное, отображаемое шаблоном.Таким образом, ваш вспомогательный метод может просто создать и вернуть строку:

def note_display(note)
  content = ''
  content << content_tag('h2', h(note.name), :class => 'title')
  if note.linktype == 'other'
    content << javascript_tag("some javascript")
  elsif note.linktype == 'text'
    content << h(note.text)
  elsif note.linktype == 'image'
    content << image_tag(note.link)
  end  
  content
end

Вы можете использовать этот вспомогательный метод, используя:

<% @notes.each do |n| %> 
  <%= note_display(n) %>
<% end %>
...