У меня есть следующий интерфейс для ориентированного на бейсбол проекта моего хобби , который позволяет владельцу команды создать набор критериев для ранжирования игроков:
Нажатие на атрибуты добавит этот атрибут в список, придаст ему фактор важности и направление сортировки.
В 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, как из которых расстраивает отладку.
Хотя должен быть лучший способ (и я уверен, что есть лучший интерфейс для этого, предложения приветствуются!).