Rails: кнопка Follow / Follow для отношений - PullRequest
3 голосов
/ 16 февраля 2012

У меня есть пользовательская модель, которая может создавать отношения, чтобы иметь последователей и следовать за другими, и все, что я узнал из руководства по рельсам, работало замечательно.Во-первых, я пытаюсь перейти к следующему шагу, добавив возможность видеть последователей других людей и иметь возможность нажимать кнопку «следовать / следовать».Очевидно, что код, который находится на своем месте, размещает все, где он должен быть (небольшой профиль подписчиков, кнопки и т. Д.), Но когда я нажимаю на кнопку, он только следует за собой или лишает себя способности не относиться к конкретному человеку, которому я решаю следоватья могу это исправить?Любая помощь очень ценится!

Это код для следующей страницы и страницы подписчиков:

<div id='ContentContainer'>
<div class='ContentLeft'>
<% if @users.any? %>
<%= render @users %>
<%= will_paginate @users %>
<% end %>
</div>
</div>

Это приводит к отображению шаблона пользователя, который включает в себя

<% unless current_user?(@user) %>
<div id="follow_form_small">
<% if current_user.followed_users?(@user) %>
<%= render 'unfollow_small' %>
<% else %>
<%= render 'follow_small' %>
<% end %>
</div>
<% end %>

И затем следующие и последующие формы соответственно

<%= form_for current_user.relationships.build(followed_id: @user.id),
          remote: true do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow", :class => 'FollowButton_small' %>
<% end %>

<%= form_for current_user.relationships.find_by_followed_id(@user),
         html: { method: :delete },
         remote: true do |f| %>
  <%= f.submit "Unfollow", :class => 'UnFollowButton_small' %>
<% end %>

Контроллер отношений

class RelationshipsController < ApplicationController

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

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

Модель отношений

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

Модель пользователя Это также было добавлено к ней

def following?(other_user)
  relationships.find_by_followed_id(other_user.id)
end

def followed_users?(other_user)
  relationships.find_by_followed_id(other_user.id)
end

def follow!(other_user)
  relationships.create!(followed_id: other_user.id)
end

def unfollow!(other_user)
  relationships.find_by_followed_id(other_user.id).destroy
end

Следуйте форме

<% unless current_user?(@user) %>
<div id="follow_form_small">
<% if current_user.followed_users?(@user) %>
<%= render 'unfollow_small' %>
<% else %>
<%= render 'follow_small' %>
<% end %>
</div>
<% end %>

Текущий пользователь

private

def current_user
  @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end
helper_method :current_user

Новые правки

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

  validates :follower_id, presence: true
  validates :followed_id, presence: true

  validate :not_following_himself

  def not_following_himself 
    errors.add :followed_id,
     if followed_id == follower_id
  end

end

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

проблема с методом current_user?.он, вероятно, всегда возвращает true, и в списке пользователей кнопка «Follow» отображается со всеми пользователями (включая вашу запись), поэтому, нажав «Follow», вы можете следовать за собой.

0 голосов
/ 17 ноября 2016

Я использую validate для подписчика, теперь я создаю метод для подписчика

class Relationship < ApplicationRecord
  belongs_to :follower, class_name: User.name 
  belongs_to :followed, class_name: User.name 

  validate :follower, on: :create
  validate :followed, on: :create

  def follower
    errors.add :follower,
    unless current_user.follow @user
  end

  def followed
    errors.add :followed,
    unless current_user.unfollow @user
  end
end

Мой код верен?

0 голосов
/ 27 марта 2012

Я обнаружил, что мой код на 95% совпадает с вашим.однако я не использую form_for, вместо этого я использую link_to:

rout.rb

resources :relationships, :only => [:create, :destroy]

на мой взгляд:

<%= link_to "Follow", relationships_path(:id => @user.id), :method => :post, :remote => 'true', :class => "FollowButton_small"%>

relations_controller.rb

def create
  @followed = User.find(params[:id])
  current_user.follow!(@followed)
  respond_to do |format|
    format.js { @user = @followed}
  end
end

в user.rb

def follow!(followed)
  relationships.create!(:followed_id => followed.id)
end

надеюсь, мой код поможет !!

0 голосов
/ 16 февраля 2012

Я не думаю, что здесь достаточно кода, чтобы точно определить, в чем проблема. Вы также должны предоставить действия контроллера.

Вот несколько шагов, которые вы можете предпринять для его отладки:

  1. Действие контроллера для отношения / создания должно использовать params [: follow_id] и current_user.id.
  2. Добавьте проверку в Отношения, в которой говорится follow_id! = Follower_id и оба идентификатора присутствуют.
  3. Посмотрите на сгенерированный HTML в форме «Follow» и убедитесь, что значение скрытого поля для follow_id является правильным. Идентификатор должен отличаться от текущего зарегистрированного пользователя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...