2011-06-26 33 views
8

Tengo un producto, un usuario y un modelo similar. Un usuario puede gustarle un producto. Estoy tratando de implementar un botón similar simple que, al hacer clic, permite que un usuario le guste un producto. Luego, el botón Me gusta se transforma en un botón diferente que permite al usuario diferenciarse de un producto. Muy claro.Botón de me gusta simple/diferente con rieles 3, jquery y ajax

He implementado la lógica de modelo/controlador para lo anterior. No soy muy bueno con javascript/ajax y me preguntaba cuál sería la mejor manera de implementar la funcionalidad anterior. Quiero que las acciones like/unlike sean manejadas a través de ajax. Estoy usando rails 3 y jquery ujs para mi aplicación.

Gracias.

Respuesta

36

Mi respuesta a su pregunta es larga, entonces escribí un example application. Aquí hay un fragmento:

Hay muchas maneras de despellejar a este gato, pero me gusta hacer una plantilla ujs parcial y única.

_like_button.html.erb:

<% if like = current_user.likes.find_by_product_id(@product.id) %> 
    <%= form_for like, :html => { :method => :delete }, 
        :remote => true do |f| %> 
    <%= f.submit "Unlike" %> 
    <% end %> 
<% else %> 
    <%= form_for current_user.likes.build(:product_id => @product.id), :remote => true do |f| %> 
    <%= f.hidden_field :product_id %> 
    <%= f.hidden_field :user_id %> 
    <%= f.submit "Like" %> 
    <% end %> 
<% end %> 

toggle.js.erb, donde "#like" es el div que encierra el formulario:

$("#like").html("<%= escape_javascript render('like_button') %>"); 
+1

hombre, es tan impresionante que hizo esto. Su aplicación de muestra realmente me ayudó a entender cómo funciona esto. ¡Thx a ton! – p01nd3xt3r

+0

¡Gracias por tus amables palabras! – dwhalen

+1

@dwhalen, ya no puedo encontrar la aplicación de muestra vinculada. Estoy tratando de hacer lo mismo en mi aplicación, y tengo un código casi idéntico en mi aplicación. La primera vez que todo funciona bien, aparece el botón Me gusta y, al hacer clic en él, alterna a diferencia. Sin embargo, cuando intento hacer clic en el botón "no me gusta", no pasa nada. ¿Alguna sugerencia? – Anand

1

Básicamente, para hacer sus vínculos de trabajo a través de AJAX, sólo tiene que proporcionar link_to con :remote => true argumento. Pero supongo que quieres hacer algún tipo de comentario al usuario. Eche un vistazo al screencast de this.

Cuestiones relacionadas