2016-07-11 12 views
0

Ich habe eine Menge Tutorials gelesen, und ich kann nicht scheinen, dass dies funktioniert. Ich benutze den Edelstein "acts_as_votable" und versuche, den "unähnlichen" Teil zu laden, wenn jemand eine Ressource "mag" (mein votables Modell).Mit Ajax, um eine Schiene teilweise zu laden

Resources Index:

<div class="votes"> 
    <% if (current_user.liked? resource) %> 
     <!-- Unlike --> 
     <%= render(:partial => 'unlike', :locals => {:resource => resource})%> 
    <% else %> 
     <!-- Like --> 
     <%= render(:partial => 'like', :locals => {:resource => resource})%> 
    <% end %> 
</div> 

Ressourcen Controller:

def index 
    @resources = Resource.all.order(:cached_votes_up => :desc) 
end 

def like 
    @resource = Resource.find(params[:id]) 
    @resource.liked_by current_user 
    respond_to do |format 
    format.html { redirect_to :back } 
    format.js { render layout: false } 
    end 
end 

Routen

Rails.application.routes.draw do 
    resources :resources do 
    member do 
     get "like", to: "resources#like" 
     get "unlike", to: "resources#unlike" 
    end 
    end 
end 

like.js.erb

$('.like_resource').bind('ajax:success', function(){ 
    $(this).closest('.like_resource').hide(); 
    $(this).closest('.votes').html('<%= escape_javascript (render partial: 'like', locals: { :resource => resource }) %>'); 
}); 

_like.html.erb

<%= link_to like_resource_path(resource), method: :get, remote: true, class: 'like_resource' do %> 
    <button class="ui basic compact icon right floated button vote_count"> 
     <i class="heart icon" style="color: #F1F1F1"></i> <%= resource.get_likes.size %> 
    </button> 
<% end %> 

Aktuelle Funktionalität - Wenn ich auf die Schaltfläche klicken, wird dergleichen registriert, aber die Ajax nicht die teilweise laden. Ich muss die Seite neu laden, um die aktualisierte uneinheitliche Taste zu sehen.

Wenn ich die like.js.erb-Datei so ändern, dass sie eine einfache Verknüpfung enthält, anstatt eine partielle zu laden, scheint sie korrekt geladen zu sein.

$('.like_resource').bind('ajax:success', function(){ 
    $(this).closest('.like_resource').hide(); 
    $(this).closest('.votes').html(' <%= link_to "Unlike", unlike_resource_path(@resource), remote: true, method: :get, class: 'unlike_resource' %>'); 
}); 
+0

versuchen, dieses '$ (this) .closest (‘ Stimmen. ') Html (' <% = escape_javascript (machen teilweise. "Gefällt mir", Einheimischen: {: resource = > Ressource})%> '); ' – uzaif

+0

Leider schien das nicht zu funktionieren. Ich habe gerade die letzten Änderungen aufgegriffen, wenn Sie sich das aktuelle Verhalten ansehen möchten - www.sansfrancis.co. – rcrusoe

+0

Ich überprüfte die Konsole, während ich auf die Schaltfläche "Gefällt mir" klicke, und es scheint einen Fehler von 500 zu geben. – rcrusoe

Antwort

1

Haben Sie dies behoben! Die Konsole gab einen 500-internen Fehler aus, bot jedoch wenig Einblick in das, was gerade geschah. Ich sprang in log/development.log und fand diesen Fehler:

undefined local variable or method `resource' 

ich in der Ajax-Teil lokale Variable Aufruf ein "@" fehlte. Ändern Sie die letzte Zeile dazu:

$(this).closest('.votes').html('<%= escape_javascript (render partial: 'like', locals: { :resource => @resource }) %>'); 
+0

sind Sie vermisst Instanzvariable? – uzaif