为什么找不到我的Ruby模型方法?

时间:2015-09-07 15:46:18

标签: ruby-on-rails ruby model controller relationship

我有联系人,群组以及组成联系人组的成员的模型,这些联系人通过名为成员的关系进行链接。成员模型使用: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>

这是否与找不到该方法的原因有关?我做错了什么?

4 个答案:

答案 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的特定实例才能调用此方法。