Простая кнопка «нравится/не нравится» с rails 3, jquery и ajax

У меня есть продукт, пользователь и нравится модель. Пользователю может понравиться продукт. Я пытаюсь реализовать простую кнопку «Нравится», которая при нажатии позволяет пользователю полюбить продукт. Затем кнопка «Мне нравится» превращается в кнопку «Не нравится», что позволяет пользователю отклонить товар. Довольно просто.

Я реализовал логику модели/контроллера для вышеизложенного. Я не очень хорошо разбираюсь в javascript/ajax, и мне было интересно, как лучше всего реализовать вышеуказанную функциональность. Я хочу, чтобы подобные/неподобающие действия обрабатывались через ajax. Я использую рельсы 3 и jquery ujs для своего приложения.

Спасибо.


person deruse    schedule 26.06.2011    source источник


Ответы (2)


Мой ответ на ваш вопрос длинный, поэтому я написал пример приложения. Вот фрагмент:

Есть много способов снять шкуру с этого кота, но мне нравится рендерить частичный и одиночный шаблон ujs.

_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, где "#like" — это div, охватывающий форму:

$("#like").html("<%= escape_javascript render('like_button') %>");
person dwhalen    schedule 26.06.2011
comment
Чувак, это так здорово, что ты сделал это. Ваш образец приложения действительно помог мне понять, как это работает. Спасибо тонна! - person p01nd3xt3r; 23.07.2011
comment
@dwhalen, я больше не могу найти связанный пример приложения. Я пытаюсь сделать то же самое в своем приложении, и у меня почти идентичный код в моем приложении. В первый раз все работает нормально, появляется кнопка «Мне нравится», и при нажатии на нее она переключается на «Не нравится». Однако, когда я пытаюсь нажать кнопку «Непохоже», ничего не происходит. Какие-либо предложения? - person Anand; 26.04.2012
comment
Как я могу добавить что-то в базу данных, чтобы увидеть этот пример в действии? - person finiteloop; 05.07.2012
comment
Следуйте инструкциям: github.com/invisiblefunnel/soquestion6482354#getting-started. rake db:seed. - person dwhalen; 05.07.2012
comment
@dwhalen, большое спасибо за пример! Теперь я понимаю лучше :) У меня только одна проблема: когда я нажимаю «Отклонить», я получаю в журнале ошибку ActiveRecord::RecordNotFound (Couldn't find Like with id=11): app/controllers/likes_controller.rb:9:in destroy'`. «Не нравится» не обновляется до «Нравится», пока я не нажму еще раз... Знаете почему? - person Justin D.; 10.07.2012
comment
Хороший пример приложения, я просто хочу, чтобы он был завершен, чтобы мы могли увидеть ваш образец приложения в действии. - person Serge Pedroza; 08.02.2013
comment
К вашему сведению, вы можете найти исходный код примера приложения в следующих ответвлениях: github.com/shihabullal/soquestion6482354 , github.com/shihabullal/soquestion6482354, github.com/sergeylukin/soquestion6482354, github.com /haon/soquestion6482354 - person dwhalen; 07.05.2013

По сути, чтобы ваши ссылки работали через AJAX, вам просто нужно указать link_to с аргументом :remote => true. Но я предполагаю, что вы хотите сделать какую-то обратную связь с пользователем. Взгляните на этот скринкаст.

person bassneck    schedule 26.06.2011