2011-06-26 17 views
8

Ürün, kullanıcı ve benzeri bir modelim var. Bir kullanıcı bir ürünü beğenebilir. Bir tıklamayla kullanıcının bir ürünü beğenmesini sağlayan basit bir düğme kullanmaya çalışıyorum. Ardından, benzer düğme, kullanıcının bir ürünü beğenmemesine izin veren farklı bir düğmeye dönüşür. Oldukça basit.Basit ve benzer raylar ile düğme 3, jquery ve ajax

Yukarıdakiler için model/denetleyici mantığı uyguladım. Javascript/ajax ile çok iyi değilim ve yukarıdaki işlevselliği uygulamak için en iyi yolun ne olacağını merak ediyordum. Ajax ile ele alınacak benzer/farklı eylemleri istiyorum. Benim app için raylar 3 ve jquery ujs kullanıyorum.

Teşekkürler.

cevap

36

Sorunuza yanıtım uzun, bu yüzden bir example application yazdım. İşte bir parça:

Bu kediyi ciltlemek için birçok yol var, ancak kısmi ve tek bir ujs şablonu oluşturmayı seviyorum.

_like_button.html.erb

: "#like" formunu çevreleyen div olduğunu
<% 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

:

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

Adamım, buna yaptığını onun çok harika. Örnek uygulamanız, bunun nasıl çalıştığını anlamamda gerçekten yardımcı oldu. Bir ton! – p01nd3xt3r

+0

Nazik sözlerin için teşekkürler! – dwhalen

+1

@dwhalen, Artık bağlı örnek uygulamayı bulamıyorum. Uygulamamda aynı şeyi yapmaya çalışıyorum ve uygulamamda neredeyse aynı kod var. Her şeyin etrafında ilk kez iyi çalışır, Beğen düğmesi görünür ve tıklandığında, aksine değişmez. Ancak, farklı düğmeyi tıklatmaya çalıştığımda hiçbir şey olmuyor. Baska öneri? – Anand

1

Temel olarak, bağlantılarınızı AJAX aracılığıyla yapmak için, :remote => true argümanı ile sağlamanız yeterlidir. Ama sanırım kullanıcıya bir çeşit geri bildirim yapmak istiyorsun. this screencast'a bir göz atın.