Похоже, вы пропустили, что @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