Rails 5 отображает текущие контакты пользователей - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь показать только контакты current_user через рельсы. current_user метод:

def index
    if params[:category_id] && !params[:category_id].empty?
      category_find = Category.find(params[:category_id])
      @contacts = category_find.current_user.contacts.search(params[:term]).order(created_at: :desc).page params[:page]
    else
      @contacts = Contact.current_user.search(params[:term]).order(created_at: :desc).page params[:page]
    end
  end

модель контактов:

   scope :search, -> (term) do
    where('LOWER(name) LIKE :term or LOWER(email) LIKE :term or LOWER(country) LIKE :term', term: "%#{term.downcase}%") if term.present?
  end

Но возвращается unfined method current_user.

что я здесь делаю, что мешает мне показывать контакты только для текущего пользователя?

РЕДАКТИРОВАТЬ:

Вот контакт пользователя:

class Contact < ApplicationRecord
  belongs_to :category
  has_one_attached :contact_avatar
  belongs_to :user


  validates :name, :email, presence: true
  validates_length_of :name, minimum: 3
  validates_length_of :mobile, minimum: 7, maximum: 15, allow_blank: true
  validates_length_of :phone, minimum: 7, maximum: 15, allow_blank: true


  scope :search, -> (term) do
    where('LOWER(name) LIKE :term or LOWER(email) LIKE :term or LOWER(country) LIKE :term', term: "%#{term.downcase}%") if term.present?
  end


end

Вот модель пользователя.

class User < ApplicationRecord
  has_many :contacts
  has_many :categories

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_one_attached :user_avatar
end

Вот модель категории:

class Category < ApplicationRecord
    has_many :contacts
    belongs_to :user
end

Примечание. Я использую gem для разработки для аутентификации.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

У вас есть User#contacts и User#categories ассоциации, просто используйте их:

def index
  if params[:category_id] && !params[:category_id].empty?
    category = Category.find(params[:category_id])
    @contacts = current_user.contacts.where(category: category)
  else
    @contacts = current_user.contacts
  end
  @contacts = @contacts.search(params[:term]).order(created_at: :desc)
end

или, может быть, даже лучше (с некоторым рефакторингом):

@contacts = current_user.contacts.search(params[:term]).order(created_at: :desc)
if params[:category_id].present?
  category = Category.find(params[:category_id])
  @contacts = @contacts.where(category: category)
end
0 голосов
/ 06 февраля 2020

Если вы действительно хотели сделать эту цепочку доступной, вы должны написать ее как:

class Contact < ApplicationRecord
  # ...

  # don't use scope for anything except oneliners
  def self.search(term)
    return self unless term.present? # prevents nil error
    where(
      'LOWER(name) LIKE :term or LOWER(email) LIKE :term or LOWER(country) LIKE :term',
      term: "%#{term.downcase}%"
    )
  end

  def self.by_category(category_id)
    category_id.present? ? where(category_id: category_id) : self
  end
end

Ключ в том, что ваши "области видимости" (которые на самом деле являются просто методами класса) всегда должны возвращать ActiveRecord :: Relation или self, который предотвращает ноль ошибок.

def index
   @contacts = current_user.contacts
                             .search(params[:term])
                             .by_category(params[:category_id])
                             .order(created_at: :desc)
                             .page(params[:page])
end 
0 голосов
/ 06 февраля 2020

Это будет работать для вас.

  def index
    if params[:category_id].present?
        category = Category.find(params[:category_id])
        @contacts = category.current_user.contacts
    else
        @contacts = current_user.contacts
    end
    @contacts = @contacts.search(params[:term]).order(created_at: :desc).page params[:page]
  end

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

Лучший способ сначала получить объект пагинации, а затем отфильтровать запись основа входящих параметров, как показано ниже.

def index
  // Here we are trying to fetch all contacts of current user, order and paginate also.
  @contacts = current_user.contacts.order(created_at: :desc).page(params[:page])
  // Here we are filtering current user all contact for particular category if category_id is present.  
  @contacts = @contacts.where(category_id: params[:category_id]) if params[:category_id].present?
  // Here we are filtering records with search term
  @contacts = @contacts.search(params[:term]) if params[:term].present?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...