Я нашел много людей с той же проблемой, что и я, но ни одно из решений не применимо к моей ситуации. Я следую учебному пособию Майкла Хартла здесь. У меня есть система слежения, настроенная в соответствии с главой 14 (я использую последнее издание книги, так как я на Rails 5.1). Кнопка «следовать / отменить подписку» обрабатывает базу данных, но мне нужно вручную обновить страницу, чтобы увидеть кнопку и следить за изменением счетчика.

Я получаю это в журнале консоли браузера:

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

Просмотров / пользователей / _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
ddonche 29 Май 2017 в 00:11

2 ответа

Лучший ответ

Вы устанавливаете локальную переменную user

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

Но ссылка на переменную экземпляра класса @user в шаблоне .js.erb.

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

Вместо этого установите @user = User.find(params[:followed_id]), чтобы он был доступен для просмотра. На самом деле, я думаю, что вы пытаетесь установить @user = current_user. Это может иметь больше смысла.

1
Chloe 28 Май 2017 в 21:48

Вам нужно переименовать файлы Javascript, чтобы завершить .erb.

relationships/create.js.erb и relationships/destroy.js.erb. Это потому, что у вас есть Ruby в файле, поэтому он должен обработать Ruby, прежде чем он будет интерпретирован как Javascript и отправлен обратно.

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

-1
Chloe 28 Май 2017 в 21:28