2011-06-26 23 views
8

Mam produkt, użytkownika i model podobny. Użytkownik może polubić produkt. Próbuję zaimplementować prosty podobny przycisk, który po kliknięciu pozwala użytkownikowi polubić produkt. Następnie przycisk podobny przekształca się w niepodobny przycisk, pozwalając użytkownikowi na niepodobny do produktu. Całkiem proste.Przycisk prosty lub inny niż w przypadku szyn 3, jquery i ajax

Zaimplementowałem logikę modelu/kontrolera dla powyższego. Nie jestem zbyt dobry w javascript/ajax i zastanawiałem się, jaki byłby najlepszy sposób implementacji powyższej funkcjonalności. Chcę, aby podobne/niepodobne działania były obsługiwane za pośrednictwem ajax. Używam rails 3 i jquery ujs dla mojej aplikacji.

Dzięki.

Odpowiedz

36

Moja odpowiedź na twoje pytanie jest długa, dlatego napisałem: example application. Oto fragment:

Istnieje wiele sposobów na skórze tego kota, ale lubię renderować częściowy i pojedynczy szablon UDS.

_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, gdzie "#like" jest div załączając formularz:

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

Człowiek, jego tak niesamowite, że to zrobił. Twoja przykładowa aplikacja naprawdę pomogła mi zrozumieć, jak to działa. Thx ton! – p01nd3xt3r

+0

Dzięki za miłe słowa! – dwhalen

+1

@dwhalen, nie mogę znaleźć powiązanej przykładowej aplikacji. Próbuję zrobić to samo w mojej aplikacji i mam prawie identyczny kod w mojej aplikacji. Po raz pierwszy wszystko działa dobrze, pojawia się przycisk Lubię to, a po kliknięciu przełącza się na inny. Jednak gdy spróbuję kliknąć przycisk odmienny, nic się nie dzieje. Jakieś sugestie? – Anand

1

Zasadniczo, aby linki działały przez AJAX, wystarczy podać link_to z argumentem :remote => true. Ale myślę, że chcesz przekazać użytkownikowi jakieś informacje zwrotne. Spójrz na screencast this.