Показывать профиль пользователя, только если он является контактом с текущим пользователем - PullRequest
0 голосов
/ 18 ноября 2018

Контроллер моих пользователей:

class UsersController < ApplicationController
  before_action :is_contact, only: [:show]

  def index
    @contacts = User.joins(:groups)
                   .where(groups: {id: current_user.groups})
                   .where.not(id: current_user).uniq
  end

  def show

  end

  private

  def is_contact
    user = User.find(current_user.id)
    if user = !@contacts
      flash[:alert] = "Sorry, you don't know each other."
      redirect_to root_path
    end
  end
end

Просмотр моих контактов, где вы можете отправить сообщение (работает) или просмотреть профиль (не работает):

 <% @contacts.each do |contact| %>
     <h3><%= contact.name %></h3>
     <%= link_to 'view profile', user_path(contact), class: "btn"
  <% end %>

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Похоже, вы пропустили, что @contacts - это переменная экземпляра, и она не распределяется между запросами.В основном, когда вы пытаетесь увидеть, есть ли контакты в методе is_contact, переменная @contacts равна nil.

Показать и индексировать - это 2 разных запроса.Когда вы обращаетесь к странице индекса, переменная @contacts была создана, но когда вы щелкаете ссылку пользователя на странице индекса, тогда выполняется другой запрос на показ действия, и в этом запросе у вас нет данных, которые были установлены для index действие.Вам нужно будет сделать запрос в БД, чтобы получить контакты отдельно для действия show.

class UsersController < ApplicationController
  before_action :contacts, only: %i[index show]
  before_action :is_contact, only: [:show]

  def index; end

  def show; end

  private

  def contacts
    @contacts ||= User.joins(:groups)
                  .where(groups: {id: current_user.groups})
                  .where.not(id: current_user).uniq
  end

  def is_contact
    user = User.find(params[:id)

    unless @contacts.detect { |contact| contact.id == user.id }
      flash[:alert] = "Sorry, you don't know each other."
      redirect_to root_path
    end
  end
end
0 голосов
/ 18 ноября 2018
  def is_contact
    user = User.find(current_user.id)
    if user = !@contacts
  • условным является присваивание, для проверки равенства необходимо использовать `==
  • также вам нужно проверить наличие в списке, @contacts будет массивом, который никогда не будет равен члену списка
  • Вы также проверяете, является ли current_user контактом, я думаю, вам нужно найти пользователя, который просматривается

Вероятно, должно быть что-то вроде этого. Я бы вытащил проверку is_contact на простой объект ruby, чтобы концепция была ясной и внешней по отношению к вашему контроллеру.

  def is_contact
    viewed_user = User.find(params[:id])
    viewed_user_is_contact = @contacts.any? {|contact| contact == user}
    if !viewed_user_is_contact
      #flash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...