Rails API - доступ к методам, расположенным в модели? - PullRequest
0 голосов
/ 11 июля 2020

Я создал одноразовое веб-приложение на рельсах, чтобы проверить некоторые новые концепции. При этом я создал методы, которые принадлежали модели, чтобы сохранить принцип легкости и простоты контроллеров.

Однако сейчас я тестирую то же приложение, но через API-интерфейс rails. Могу ли я сохранить эти методы в модели?

  1. Я не уверен, как маршрутизировать API для доступа к этим методам.
  2. Потому что он включает вложенную модель (контакты через пользователей ), Я даже не знаю, с чего начать ставить в контроллер. Могу ли я сделать контроллер для вложенной модели?

Вот модель пользователя, которая дает представление о том, о чем я говорю. Большинство методов необходимы для процесса добавления / приема и создания контактов.

class User < ApplicationRecord

  has_many :contactships, dependent: :destroy
  has_many :contacts, -> { where contactships: { status: :accepted }}, through: :contactships
  has_many :requested_contacts, -> { where contactships: { status: :requested }}, through: :contactships, source: :contact
  has_many :pending_contacts, -> { where contactships: { status: :pending }}, through: :contactships, source: :contact
  has_many :blocked_contacts, -> { where contactships: { status: :blocked }}, through: :contactships, source: :contact

  has_many :contactships_inverse, class_name: 'Contactship', foreign_key: :contact_id
  has_many :contacts_inverse, through: :contactships_inverse, source: :user

  has_one_attached :avatar

  validates_presence_of :first_name, :last_name

  def full_name
    "#{first_name} #{last_name}"
  end

  def all_contacts
    contacts + contacts_inverse
  end

  def has_contactship?(contact)
      #return true if the user is a contact
      return true if self == contact
      contactships.map(&:contact_id).include?(contact.id)
  end

  def requested_contacts_with?(contact)
      return false if self == contact
      #we are going to map requested contacts with list of users to see if they include contact_id
      requested_contacts.map(&:id).include?(contact.id)
  end

  def pending_contacts_with?(contact)
      return false if self == contact
      pending_contacts.map(&:id).include?(contact.id)
  end

  def contacts_with?(contact)
      return false if self == contact
      contacts.map(&:id).include?(contact.id)
  end

  def contact_request(contact)
    #unless the contact is not equal to self and contactship does not already exist
    unless self == contact || Contactship.where(user: self, contact: contact).exists?
        #transaction means that if one fails they both are rolled back
        transaction do
            #for user to another user (sent request)
            Contactship.create(user: self, contact: contact, status: :pending)
            #from another user to user (recieve request)
            Contactship.create(user: contact, contact: self, status: :requested)
        end
     end
  end

  def accept_request(contact)
      transaction do
        Contactship.find_by(user: self, contact: contact, status: [:requested])&.accepted!
        Contactship.find_by(user: contact, contact: self, status: [:pending])&.accepted!
      end
  end

  def reject_request(contact)
      transaction do
        Contactship.find_by(user: self, contact: contact)&.destroy!
        Contactship.find_by(user: contact, contact: self)&.destroy!
      end
  end

end

Спасибо!

1 Ответ

2 голосов
/ 11 июля 2020

Вам нужно создать вызов контроллеру. Давайте рассмотрим пример ниже.

class UsersController < ApplicationController

  def method_name
    @user = User.find(params[:id])
    # Now you can access all the user model methods using @user.model_method_name
    @user.all_contacts
  end

end

Вам необходимо определить routes для этого контроллера в routes.rb

Вы создали instance methods в модели user. Вы можете получить к ним доступ с помощью экземпляра user

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...