Какой лучший способ рефакторинга link_to_function в UJS? - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть следующий интерфейс для ориентированного на бейсбол проекта моего хобби , который позволяет владельцу команды создать набор критериев для ранжирования игроков:

ranking_formula

Нажатие на атрибуты добавит этот атрибут в список, придаст ему фактор важности и направление сортировки.

В Rails 2 и Rails 3 (с помощниками-прототипами) - я сделал это, имея следующее:

<div class="rankingvaluecloud">
  <ul> 
      <% @rankingattributes.each do |attributename| %>
        <li><%= add_ranking_attribute_link(attributename) %></li>
      <% end %>
  </ul>
</div>
<div id="rankingattributes">
</div>

Где "add_ranking_attribute_link (attributetename)":

def add_ranking_attribute_link(attributename) 
  link_to_function attributename do |page| 
    page.insert_html :bottom, :rankingattributes, :partial => 'ranking_attribute', :locals => {:attributename => attributename }
  end
end

Я конвертирую это в jquery, но я не уверен, что лучший способ сделать это - в основном из-за задействованного цикла. Я могу сделать это:

<div class="rankingvaluecloud">
  <ul> 
      <% @rankingattributes.each do |attributename| %>
        <li><%= link_to(attributename,'#',:class => 'attributeappend', :onclick => "$('#rankingattributes').append('#{escape_javascript(render(:partial => 'ranking_attribute',:locals => {:attributename => attributename}))}')") %></li>
      <% end %>
  </ul>
</div>
<div id="rankingattributes">
</div>

Который в основном просто заменяет функцию link_to_function. Но есть ли лучший способ? Путь ujs заставил бы меня сделать что-то вроде:

$(".attributeappend).click(function() {
  $('#rankingattributes').append('#{escape_javascript(render(:partial => 'ranking_attribute',:locals => {:attributename => attributename}))}')
});

Но это не сработает вне цикла из-за обработки имени атрибута. Честно говоря, я немного потерял смешение в erb и javascript - и не знаю хорошего способа передачи имени атрибута в качестве параметра в функцию javascript для вставки обратно в партиал рендеринга без хрупкого каскада отладочных ошибок синтаксиса erb и javascript, как из которых расстраивает отладку.

Хотя должен быть лучший способ (и я уверен, что есть лучший интерфейс для этого, предложения приветствуются!).

1 Ответ

0 голосов
/ 24 декабря 2011

Я бы сделал это в представлении:

link_to 'attributename','#',:class => 'attributeappend'

, и тогда соответствующий бит js будет

$(".attributeappend").click(function() {
  $('#rankingattributes').append($('#template').html().replace(/toReplace/g, $(this).text());
  return false;
});

Это предполагает, что у вас есть невидимый элемент на страницес идентификатором template, что-то вроде

<div id="template">
 Attribute: toReplace
 ...

</div>

При нажатии на ссылку, JavaScript запускается.Он извлекает html из шаблона и заменяет все экземпляры toReplace текстом, извлеченным из ссылки, и добавляет его к элементу с идентификатором ranking attributes.

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

...