2017-05-28 56 views
0

我發現很多人都遇到了同樣的問題,但沒有一個解決方案適用於我的情況。我正在關注Michael Hartl's tutorial here。我有一個按照第14章設置的跟蹤系統(我使用本書的最新版本,因爲我在Rails 5.1上)。數據庫中的follow/unfollow按鈕進程,但我必須手動刷新頁面以查看按鈕並按照計數更改。AJAX按鈕流程不會更改

我得到這個在瀏覽器控制檯日誌:

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 

的意見/用戶/ _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 %> 

的意見/ users/_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 %> 

的意見/用戶/ _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 %> 

關係/ create.js.erb

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

關係/ 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 

我在做什麼錯?

+0

你爲什麼認爲它應該改變按鈕? 'onclick()'Javascript事件在哪裏? ':back'在這裏有什麼用? 'redirect_to(:back)'試着'redirect_to user_path(@user)'或者你正在查看的任何頁面,然後重新加載頁面。你爲什麼在標題中說AJAX,但在你的問題中沒有AJAX調用('$ .post()')?爲此顯示JS。 – Chloe

+0

你包括jquery_ujs嗎? –

+0

我的application.js文件中需要jquery_ujs。 – ddonche

回答

1

你在你的.js.erb模板中設置局部變量user

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

但引用類實例變量@user

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

取而代之,設置@user = User.find(params[:followed_id])因此它可用於視圖。其實,我認爲你正在設置@user = current_user。這可能更有意義。

+0

將其更改爲@user = ...實際上破壞了整個功能,因此db部分甚至不起作用。 – ddonche

+0

問題是,方法中的所有變量都需要成爲實例變量。 – ddonche

-1

您需要重命名您的Javascript文件才能以.erb結尾。

relationships/create.js.erbrelationships/destroy.js.erb。這是因爲你在文件中有Ruby,所以在它被解釋爲Javascript並被髮回之前,它必須處理Ruby。

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

+1

我的錯誤,他們在我的應用程序中有.js.erb擴展名,我在這裏搞砸了。 – ddonche

+0

你可以添加'console.log(「<%= escape_javascript(render('users/unfollow'))%>」);'給他們看看它是否在瀏覽器控制檯中呈現正確的文本? – Chloe

+0

我添加了控制檯的東西到我的問題。 – ddonche