我有联系人,群组以及组成联系人组的成员的模型,这些联系人通过名为成员的关系进行链接。成员模型使用:through
属性解析联系人和组之间的多对多关系。
当我尝试向Contact
模型添加一个名为建议的新方法并从ContactsController
调用它时,如下所示,我收到一条消息,告诉我找不到该方法。 ContactsController看起来像这样:
class ContactsController < ApplicationController
before_action :logged_in_user, only: [:index, :show, :edit, :update, :destroy]
before_action :set_contact, only: [:show, :edit, :update, :destroy]
# GET suggestions
def suggestions
recipients_string = params[:recipients_field]
# Call theContact model to list of all of the groups and individual contacts that aren't already in the recipient list
# and return them as an html unordered list of clickable links
@suggestions = contacts.suggestions[recipients_string: :recipients_string]
end
...
...
end
联系人的模型如下:
class Contact < ActiveRecord::Base
has_many :members
has_many :groups, :through => :members
default_scope -> { order(name: :asc) }
validates :name, presence: true
validates :email, presence: true
accepts_nested_attributes_for :members,
:reject_if => :all_blank,
:allow_destroy => true
accepts_nested_attributes_for :groups
def suggestions
recipients_string = params[:recipients_string]
# some processing here to ptoduce @suggestions
@suggestions
end
end
在Contacts
的使用中,我不想利用这种关系,但我注意到当我致电contacts.suggestions
时,我得到了
undefined method `suggestions' for #<Contact::ActiveRecord_Relation:0x007fd75b32c988>
这是否与找不到该方法的原因有关?我做错了什么?
答案 0 :(得分:2)
因为contacts.suggestions
会返回一系列联系人,实际上是一个Relation
,其范围是联系人集合而不是单个联系人。
suggestions
被定义为实例方法,因此应该在单个实例上调用,而不是在集合上调用。
更改方法的范围或确保contacts
不返回集合。
答案 1 :(得分:1)
该错误告诉您Object {$: "foo"}
是一种关系,就像联系人记录的集合。 (我希望它实际上抱怨没有变量或方法称为contacts
)
您的意思是从contacts
定义@contact
变量,然后在其上调用params[:id]
吗?
您的联系人类中的.suggestions
方法无法正常工作,因为它引用了suggestions
,除非您将它们传递给方法,否则这些方法在模型类中不可用作为参数。
答案 2 :(得分:0)
我认为这是因为你在一组联系人上调用这些方法。 您的方法仅存在于一个联系人
也许试试这个:
@suggestions = contacts.map{|contact| contact.suggestions[recipients_string: :recipients_string]}
答案 3 :(得分:0)
您在ActiveRecord关系上调用建议(),而不是单个联系人。您需要获取Contact的特定实例才能调用此方法。