2017-05-28 8 views
0

Ich habe eine Menge Leute mit dem gleichen Problem, das ich habe, aber keine der Lösungen für meine Situation gelten. Ich folge Michael Hartl's tutorial here. Ich habe ein Folgesystem gemäß Kapitel 14 eingerichtet (ich verwende die neueste Ausgabe des Buches, da ich auf Rails 5.1 bin). Die Follow/Unfold-Schaltfläche wird in der Datenbank verarbeitet, aber ich muss die Seite manuell aktualisieren, um die Schaltfläche zu sehen und die Zähleränderung zu verfolgen.AJAX-Taste Prozesse, ändert sich nicht

bekomme ich diese im Browser Konsolenprotokoll:

POST 500 (Internal Server Error) 
    jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:10255 
    send @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:10255 
    ajax @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:9739 
    ajax @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:94 
    handleRemote @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:179 
    (anonymous) @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:512 
    dispatch @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:5227 
    elemData.handle @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:4879 

relationships_controller.rb:

class RelationshipsController < ApplicationController 
    before_action :authenticate_user! 

    def create 
    user = User.find(params[:followed_id]) 
    current_user.follow(user) 
    respond_to do |format| 
     format.html { redirect_to(:back) } 
     format.js 
    end 
    end 

    def destroy 
    user = Relationship.find(params[:id]).followed 
    current_user.unfollow(user) 
    respond_to do |format| 
     format.html { redirect_to(:back) } 
     format.js 
    end 
    end 
end 

views/users/_follow.html.erb:

<%= form_for(current_user.active_relationships.build, remote: true) do |f| %> 
    <div><%= hidden_field_tag :followed_id, @user.id %></div> 
    <%= f.submit "Follow", class: "btn btn-primary" %> 
<% end %> 

views/Benutzer/_unfollow.html.erb

<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id), 
        html: { method: :delete }, remote: true) do |f| %> 
    <%= f.submit "Unfollow", class: "btn" %> 
<% end %> 

views/users/_follow_form.html.erb

<% if current_user != @user %> 
    <div id="follow_form"> 
    <% if current_user.following?(@user) %> 
     <%= render 'unfollow' %> 
    <% else %> 
     <%= render 'follow' %> 
    <% end %> 
    </div> 
<% end %> 

Beziehungen/create.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>"); 
$("#followers").html('<%= @user.followers.count %>'); 

Beziehungen/destroy.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>"); 
$("#followers").html('<%= @user.followers.count %>'); 

users_controller. rb

class UsersController < ApplicationController 
    before_action :authenticate_user!, only: [:index, :edit, :update, :destroy, 
             :following, :followers] 

    def index 
    @page_title = "Forge Users" 
    @users = User.all 
    end 

    def show 
    @user = User.find(params[:id]) 
    @posts = Post.all 
    end 

    def following 
    @title = "Following" 
    @user = User.find(params[:id]) 
    @users = @user.following 
    render 'show_follow' 
    end 

    def followers 
    @title = "Followers" 
    @user = User.find(params[:id]) 
    @users = @user.followers 
    render 'show_follow' 
    end 

end 

Was mache ich falsch?

+0

Warum denken Sie, sollte es den Knopf ändern? Wo ist das 'onclick()' Javascript-Ereignis? Was bedeutet "zurück" in diesem? 'redirect_to (: zurück)' Versuchen Sie 'redirect_to user_path (@user)' oder welche Seite Sie gerade betrachten, dann wird die Seite neu geladen. Warum sagst du AJAX in deinem Titel, aber es gibt keine AJAX-Aufrufe ('$ .post()') in deiner Frage? Zeigen Sie das JS dafür. – Chloe

+0

Haben Sie jquery_ujs eingeschlossen? –

+0

Ich habe jquery_ujs in meiner Datei application.js benötigt. – ddonche

Antwort

1

Sie setzen lokalen Variable user

def create 
    user = User.find(params[:followed_id]) 

aber Referenzklasse Instanzvariable @user in Ihrer .js.erb Vorlage.

$("#followers").html('<%= @user.followers.count %>'); 

Stattdessen legen @user = User.find(params[:followed_id]) so dass es auf die Ansichten zur Verfügung. Eigentlich glaube ich, dass Sie versuchen, @user = current_user einzustellen. Das könnte mehr Sinn machen.

+0

Ändern Sie es in @user = ... tatsächlich brach die gesamte Funktionalität, so dass der DB-Teil nicht einmal funktioniert. – ddonche

+0

Das Problem bestand darin, dass alle Variablen in der Methode Instanzvariablen sein mussten. – ddonche

-1

Sie müssen Ihre Javascript-Dateien umbenennen, um .erb zu beenden.

relationships/create.js.erb und relationships/destroy.js.erb. Das liegt daran, dass Sie Ruby in der Datei haben, damit es den Ruby verarbeiten muss, bevor er als Javascript interpretiert und zurückgesendet wird.

http://guides.rubyonrails.org/working_with_javascript_in_rails.html#a-simple-example

+1

mein Fehler, sie haben die Erweiterung .js.erb in meiner App, ich habe es hier versaut. – ddonche

+0

Können Sie 'console.log (" <% = escape_javascript (render ('users/unfollow')))%> ");' hinzufügen und sehen, ob es den richtigen Text in der Browserkonsole darstellt? – Chloe

+0

Ich habe das Konsolenmaterial zu meiner Frage hinzugefügt. – ddonche