2011-08-01 20 views
7

Mam zapytań na posty użytkownika (zagnieżdżone zasoby, oczywiście) i mają długą listę wpisów od różnych użytkowników. Chciałbym, aby użytkownik mógł kliknąć małą gwiazdkę obok każdego posta, aby ulubiony ten konkretny post przez ajax. Wszelkie sugestie, jak to osiągnąć? Problem, który napotykam, to wiele ulubionych przycisków na jednej stronie, faworyzowanie wielu postów.szyny przycisk ajax fav dla postów użytkownika

To jest tak, jak Gmail robi z ulubionymi wiadomościami e-mail w swojej skrzynce odbiorczej. Właściwie to jest dokładnie tak.

Odpowiedz

10

Najpierw musisz skonfigurować bazę danych, aby sobie z tym poradzić, osobiście skorzystałbym ze skojarzenia has_many: through, ponieważ zapewnia on większą elastyczność niż has_and_belongs_to_many. Wybór należy jednak do Ciebie. Polecam przejrzeć różne typy w interfejsie API i samemu zdecydować. Ten przykład zajmie się has_many: through.

modele

# user.rb (model) 
has_many :favorites 
has_many :posts, :through => :favorites 

# post.rb (model) 
has_many :favorites 
has_many :users, :through => :favorites 

# favorite.rb (model) 
belongs_to :user 
belongs_to :post 

Controller

# favorites_controller.rb 
def create 
    current_user.favorites.create(:post_id => params[:post_id]) 
    render :layout => false 
end 

Trasy

match "favorites/:post_id" => "favorites#create", :as => :favorite 

jQuery

$(".favorite").click(function() { 
    var post_id = $(this).attr('id'); 
    $.ajax({ 
    type: "POST", 
    url: 'favorites/' + post_id, 
    success: function() { 
     // change image or something 
    } 
    }) 
}) 

Uwagi

ten zakłada kilka rzeczy: Używanie Rails 3, stosując jQuery, każdy ulubiona ikona ma identyfikator HTML z identyfikatorem pocztowym. Pamiętaj, że nie przetestowałem kodu i napisałem go w tym oknie, więc prawdopodobnie musisz naprawić pewne drobne problemy, ale powinno to dać ci wrażenie, jak zwykle to robi. Rzeczy wizualne i takie zostawię wam.

Jeśli zauważysz jakieś błędy, możesz edytować ten post.

1

Wykonaj form_tag dla każdego ulubionego przycisku za pomocą :remote => true. Dodaj identyfikatory wpisu i aktualnie zalogowanego użytkownika jako ukryte pola dla każdego z formularzy.

Aby zaktualizować status ulubiony, można napisać widok RJS, który będzie zawierał jQuery, aby zaktualizować ulubiony do "post został dodany".

coś takiego:

- for post in @posts 
    = form_tag toggle_favorite_post_path, :remote => true 
    = hidden_field_tag :post_id, post.id 
    = hidden_field_tag :user_id, current_user.id 
    - if Favorite.where(:post_id => post.id, :user_id => current_user.id).exists? # TODO: move this to model 
     = submit_tag "Add to favorites", :class => "favorite-post-button" 
    - else 
     = submit_tag "Remove from favorites", :class => "unfavorite-post-button" 

Można dostosować wygląd przycisku (ów) przedstawia się obraz gwiazdy z CSS.

Jeśli chcesz zapewnić możliwość wyboru wielu postów, a następnie ich wszystkich jednocześnie, musisz napisać niestandardowy javascript, aby to obsłużyć. W module obsługi kliknięcia przycisku "ulubione wszystkie wybrane", a następnie wewnątrz tego programu zbieraj wszystkie identyfikatory post, które zostały wybrane, serializuj identyfikatory do łańcucha znaków i wyślij je do kontrolera.

Powiązane problemy