2010-12-10 5 views
4

Il s'agit d'un projet Rails 3 utilisant jQuery 1.4.4.Rails 3: Comment ajouter une ligne complexe à une table en utilisant UJS?

J'ai une action d'index qui affiche une liste des ressources d'une table, avec un lien « Destroy » comme vous obtiendrez d'un échafaudage:

<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> 

Sur ce point de vue index J'ai aussi un peu la forme qui fait un AJAX « créer » pour la ressource, et j'utilise Javascript pour ajouter la ressource à la table dans mon 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>") 

C'est fragile, hideux, et non DRY. Comment puis-je faire ça?

Quelle est la manière Rails de le faire?

J'apprécie n'importe quelle aide ou conseil que vous pouvez fournir!

Répondre

4

L'astuce consiste à extraire la ligne du tableau en une partie (car elle est utilisée deux fois). Puis dans votre vue js, rendez le rendu partiel. Par exemple, voici un petit extrait pour vous aider à démarrer:

# _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)}');" 
+0

Wow, c'est propre. C'est amusant, merci Kevin. – AKWF

+0

@AKWF Pas de problème. Ruby on Rails peut être extrêmement propre une fois que vous en avez pris connaissance (bien que le code ci-dessus ne fonctionne pas). –

1

Je pense que Kevin a une petite faute de frappe dans son exemple. Il doit être utilisé variable 'objet' au lieu de '@object'

# _object.html.erb 
<%= content_tag_for(:tr, object, :class => cycle('odd','even')) do %> 
<td><%=h @object.name %></td> 
... 
0

J'ai trouvé cela fonctionnera avec erb _create.js.erb

$('#objects').append("<%= escape_javascript(render :partial => @object) %>");

Questions connexes