2010-10-13 3 views
2

Je suis en train de mettre en place des évaluations de 5 étoiles comme Netflix. L'objectif est d'avoir un div "rating" qui sert à la fois à entrer la note en cliquant sur l'une des étoiles, ainsi que d'afficher la note actuelle. Je veux mettre à jour la "note" après qu'un utilisateur entre une nouvelle cote.Ruby on Rails, mise à jour de div on click avec link_to_remote

Pour l'instant, je peux ajouter un classement et créer l'association à l'actif évalué, mais je ne peux pas actualiser le div "rating" après que les données soient sauvegardées ... Qu'est-ce que je manque?

Notes Controller:

def create 
    case params[:rating][:rateable_type] 
    when "course" 
     @course = Course.find(params[:rating][:rateable_id]) 
    end 

    @rating = Rating.new(params[:rating]) 

    if @rating.save 
     @course.ratings_sum += @rating.rating 
     @course.save 
     flash[:notice] = 'Rating was successfully created.' 
     render :partial => "ratings/rating", :locals => { :asset => @course } 
    end 
    end 

évaluations partielles (notes/_rating.html.erb):

<div id="rating"> 
<%= number_with_precision(asset.avg_rating, :precision => 1) %>/5 Stars<br> 

<ul class='star-rating'> 
    <li class='current-rating' style='width:<%= (asset.avg_rating * 17).to_s -%>px;'> 
     Currently <%= number_with_precision(asset.avg_rating, :precision => 1) %>/5 Stars. 
    </li> 
    <li> 
     <%= link_to_remote "1", :url => {:controller => "ratings", :action => :create}, 
      :update => 'rating', :partial => "ratings/rating", 
      :rating => {:rateable_type => asset.class.to_s.downcase, :rateable_id => asset.id, :rating => 1}, 
      :method => :post, :class => 'one-star', :name => '1 star out of 5' %> 
    </li> 
    <li> 
     <%= link_to_remote "2", ... 
</ul> 
</div> 

routes.rb:

map.resources :ratings

sortie de la console:

Processing RatingsController#create (for 127.0.0.1 at 2010-10-13 15:09:14) [POST] 
    Parameters: {"rating"=>{"rating"=>"1", "rateable_type"=>"course", "rateable_id"=>"42"}, "authenticity_token"=>"IodWLi9JO56tco6rgQH5vtdvKTNsE/Fih0k9jWptZmk=", "update"=>"rating"} 
    Course Columns (1.8ms) SHOW FIELDS FROM `courses` 
    Course Load (0.1ms) SELECT * FROM `courses` WHERE (`courses`.`id` = 42) 
    Rating Columns (0.9ms) SHOW FIELDS FROM `ratings` 
    SQL (0.1ms) BEGIN 
    Rating Create (0.2ms) INSERT INTO `ratings` (`rating`, `rateable_type`, `created_at`, `rateable_id`, `updated_at`, `user_id`) VALUES(1, 'course', '2010-10-13 22:09:14', 42, '2010-10-13 22:09:14', 0) 
    Course Load (0.3ms) SELECT * FROM `courses` WHERE (`courses`.`id` = 42) 
    Course Update (0.3ms) UPDATE `courses` SET `ratings_count` = COALESCE(`ratings_count`, 0) + 1 WHERE (`id` = 42) 
    SQL (0.4ms) SHOW TABLES 
    Course Update (0.3ms) UPDATE `courses` SET `updated_at` = '2010-10-13 22:09:14', `ratings_sum` = 20 WHERE `id` = 42 
    SQL (0.8ms) COMMIT 
    SQL (0.1ms) BEGIN 
    Course Update (0.2ms) UPDATE `courses` SET `updated_at` = '2010-10-13 22:09:14', `ratings_sum` = 20 WHERE `id` = 42 
    SQL (0.1ms) COMMIT 
Rendered ratings/_rating (9.7ms) 
Completed in 43ms (View: 11, DB: 6) | 200 OK [http://localhost/ratings?rating%5Brateable_id%5D=42&rating%5Brateable_type%5D=course&rating%5Brating%5D=1&update=rating] 

Et voici le code généré par "link_to_remote"

<a onclick="new Ajax.Request('/ratings?rating%5Brateable_id%5D=42&amp;rating%5Brateable_type%5D=course&amp;rating%5Brating%5D=1&amp;update=rating_bar', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('IodWLi9JO56tco6rgQH5vtdvKTNsE/Fih0k9jWptZmk=')}); return false;" name="1 star out of 5" method="post" href="#" class="one-star">1</a> 

Répondre

2

trouvé comment résoudre: je me suis déplacé la "mise à jour" et paramètres "partiels" des cotes partielles aux cotes> Créer contrôleur ... Voici à quoi il ressemble maintenant:

Notes Contrôleur: J'ai changé le options de rendu

render :update do |page| 
    page.replace_html 'star-ratings-block', :partial => 'ratings/rating', :locals => { :asset => @course } 
    end 

partielle "évaluations/_rating.html.erb":

<div id="rating_div"> 
    <%= number_with_precision(asset.avg_rating, :precision => 1) %>/5 Stars<br> 
    <ul> 
     <li> 
     <%= link_to_remote "1", {:url => { :controller => "ratings", :action => :create, 
      :rating => {:rateable_type => asset.class.to_s.downcase, :rateable_id => asset.id, :rating => 1}}}, 
      :method => :post, :class => 'one-star', :name => '1 star out of 5' %> 
     </li> 
     ... 
    </ul> 
    </div> 

Le partiel est inclus dans la vue principale comme ça:

<div 'star-ratings-block'> 
    <%= render "ratings/rating", :locals => { :asset => yourvariablehere } %> 
</div> 

Cela fonctionne maintenant comme vous le souhaitez!