2011-08-01 2 views
7

사용자 게시물 (중첩 된 리소스, 분명히)에 대해 질의를하고 다른 사용자가 올린 긴 게시물 목록을 가지고 있습니다. 사용자가 각 게시물 옆에있는 작은 별표를 클릭하여 해당 게시물을 아약스를 통해 좋아할 수있게하고 싶습니다. 이것을 달성하는 방법에 대한 제안? 내가 겪고있는 문제는 한 페이지에 여러 개의 즐겨 찾기 버튼이있어서 여러 개의 게시물을 즐겨 찾기에 넣는 것입니다.rails 사용자 포스트 용 ajax fav 버튼

Gmail이받은 편지함에서 좋아하는 이메일을 사용하는 것과 같습니다. 실제로, 그것은 정확하게 그것과 같습니다.

답변

10

먼저이 문제를 해결하기 위해 데이터베이스를 설정해야합니다. has_and_belongs_to_many에 비해 유연성이 높기 때문에 개인적으로 has_many : with association을 사용합니다. 그러나 선택은 당신에게 달려 있습니다. API에서 여러 유형을 찾아보고 스스로 결정하는 것이 좋습니다. 이 예제는 has_many : through를 다룰 것이다.

모델

# 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 

컨트롤러

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

경로

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 
    } 
    }) 
}) 

노트

이것은 몇 가지 가정 : jQuery를 사용하여 레일 (3)는, 각각 마음에 드는 아이콘이 포스트 ID로 html로 ID가 있습니다. 코드를 테스트하지 않았고이 창에서 작성 했으므로 약간의 사소한 문제를 해결해야하지만 실제로는 이 어떻게 수행되는지에 대한 인상을 주어야합니다. 시각적 인 물건들과 그런 것들은 당신에게 달려 있습니다.

누군가 실수를 저지른 경우이 게시물을 편집하십시오.

1

:remote => true으로 각 즐겨 찾기 버튼에 대해 form_tag을 수행하십시오. 게시물의 ID와 현재 로그인 한 사용자를 각 양식의 숨김 필드로 추가하십시오.

즐겨 찾기 상태를 업데이트하려면 즐겨 찾기를 "즐겨 찾기에 추가되었습니다"로 업데이트하는 jQuery가 포함 된 RJS보기를 작성할 수 있습니다. 이 같은

뭔가 :

- 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" 

당신은 CSS와 스타의 이미지로 제출 버튼 (들)의 모양을 사용자 정의 할 수 있습니다.

여러 게시물을 선택하고 동시에 모두 좋아하는 옵션을 제공하려면 맞춤 자바 스크립트를 작성하여 처리해야합니다. "좋아하는 모두 선택된"단추의 클릭 핸들러에서 핸들러 내부에서 선택된 모든 글 머리 기호를 수집하고 ID를 문자열로 직렬화 한 다음 다시 컨트롤러로 보냅니다.

관련 문제