ruby-on-rails - Rails API - 访问位于模型中的方法?
问题描述
我在 Rails 中构建了一个一次性的 Web 应用程序来测试一些新概念。在此过程中,我创建了属于模型的方法,以保持控制器轻巧简单的原则。
但是,现在我正在测试同一个应用程序,但通过 Rails API。我还能在模型中保留这些方法吗?
- 我不确定如何路由 API 以访问这些方法。
- 因为它涉及嵌套模型(通过用户联系),所以我不确定从哪里开始,甚至将它放入控制器中。我可以为嵌套模型制作控制器吗?
这是一个用户模型,可以让您了解我在说什么。大多数方法对于添加/接受和创建联系人的过程都是必不可少的。
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
谢谢!
解决方案
您需要创建对控制器的调用。让我们考虑下面的例子。
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
推荐阅读
- ruby-on-rails - Ruby on Rails 使用 gem 'iex-ruby-client'
- kotlin - 如何在 Kotlin Desktop Compose 中触发 PC 键盘输入
- ios - 具有水平布局 ScrollTo 方法的 CollectionView 不起作用 Xamarin
- python - 减少moviepy处理时间
- javascript - 如何获取具有特定开头的文件,例如。FileOne .....%,FileTwo ...%nodejs中的名称?
- html - 如何在 Bootstrap 5 的下拉菜单中插入选项卡?
- angular - 如何在我们的自定义指令中以角度解码现有的结构指令字符串语法
- vba - 检查表中的值是否与 ArrayList 中的值匹配并以下一个形式显示它们
- json - 返回一个 json 编码属性作为在 laravel 中解码的 json
- javascript - 如何让 onclick 侦听器与 python 烧瓶一起工作