Rails 3: Как я могу добавить сложную строку в таблицу, используя UJS? - PullRequest
4 голосов
/ 10 декабря 2010

Это проект Rails 3, использующий jQuery 1.4.4.

У меня есть действие index, которое отображает список ресурсов в таблице, вместе со ссылкой "Destroy", как вы получаете с эшафот:

<tr id="showcase_item_<%= showcase_item.id %>" class="<%= cycle(' alt','') %>">
  <td><%= displayable.identifier %></td>
  <td><%= escape_javascript(link_to 'Remove', showcase_item, :confirm => 'Remove this item from your Showcase?', :method => :delete, :remote => true) %></td>
</tr>

В этом индексном представлении у меня также есть небольшая форма, которая создает AJAX для ресурса, и я использую Javascript для добавления ресурса в таблицу в моем create.js.erb:

$("#showcase tr:last").after("<tr id=\"showcase_item_<%= @showcase_item.id %>\" class=\"<%= cycle(' alt','') %>\"> \
<% displayable = @showcase_item.displayable %> \
<td><%= displayable.identifier %></td> \
<td><%= link_to 'Remove', @showcase_item, :confirm => 'Remove this item from your Showcase?', :method => :delete, :remote => true %></td></tr>")

Это хрупкий, отвратительный и не СУХОЙ. Как еще я могу это сделать?

Что такое Rails-способ сделать это?

Я ценю любую помощь или руководство, которое вы можете предоставить!

Ответы [ 3 ]

4 голосов
/ 10 декабря 2010

Хитрость заключается в том, чтобы извлечь строку таблицы в часть (так как она используется дважды). Затем в вашем js представлении просто визуализируйте частичное. Например, вот небольшой фрагмент для начала:

# _object.html.erb
<%= content_tag_for(:tr, @object, :class => cycle('odd','even')) do %>
 <td><%=h @object.name %></td>
 <td><%= link_to 'Remove', object_path(@object), :method => :delete %></td>
<% end %>

# index.html.erb
<table id="objects">
  <%= render :partial => @objects %>
</table>

# create.js.rjs
page << "$('#objects').append('#{escape_javascript(render :partial => @object)}');"
1 голос
/ 13 июня 2011

Я думаю, у Кевина есть небольшая опечатка в его примере.Вместо «@ object»

# _object.html.erb
<%= content_tag_for(:tr, object, :class => cycle('odd','even')) do %>
 <td><%=h @object.name %></td>
 ...
должна использоваться переменная «object»
0 голосов
/ 01 января 2013

Я нашел, что это будет работать с erb _create.js.erb</p> <p>$('#objects').append("<%= escape_javascript(render :partial => @object) %>");

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