2015-09-07 4 views
0

У меня есть модели для контактов, групп и для членов, которые образуют группы контактов, которые связаны через отношения, называемые членами. Модель участников разрешает отношения «многие ко многим» между контактами и группами, используя атрибут :through.Почему мой метод модели Ruby не найден?

Когда я пытаюсь добавить новый метод, называемый предложениями в модель 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

Где находится "контакт"? Поскольку у вас есть 'ActiveRecord :: Relation' в' contacts', и нет метода, называемого 'предложения' в' ActiveRecord :: Relation', вы видите эту ошибку. Кроме того, в классе 'Contact', где' params' определяется или передается? – Anand

ответ

2

Это потому, что contacts.suggestions возвращает массив контактов, фактически Relation, который предназначен для коллекции контактов не для одного контакта.

suggestions определяется как метод экземпляра, поэтому его следует вызывать в одном экземпляре, а не в коллекции.

Либо измените область действия метода, либо убедитесь, что contacts не возвращает коллекцию.

+0

Спасибо, теперь я понимаю. –

0

Я думаю, это потому, что вы вызываете методы в группе контактов. Ваш метод существует только на одном контакте

возможно попробовать это:

@suggestions = contacts.map{|contact| contact.suggestions[recipients_string: :recipients_string]} 
1

Эта ошибка говорит вам, что contacts это отношение, которое, как сбор контактных записей. (Я бы ожидать, что это на самом деле жалуются на то, что нет ни одной переменной или метод называется contacts)

вы имели в виду, чтобы определить @contact переменную, например, от params[:id], а затем вызвать .suggestions по этому поводу?

Метод suggestions в вашем классе контактов не будет работать, поскольку он относится к params, и они недоступны в классе модели, если вы не передадите их методу в качестве параметра.

0

Ваши предложения() по отношению к ActiveRecord, а не индивидуальные контакты. Чтобы вызвать этот метод, вам нужно получить конкретный экземпляр Contact.

Смежные вопросы