Méthode privée sélectionnez appelé pour la classe de Rails
J'ai le code suivant à l'intérieur de mon contrôleur:
array = Contact.select(:name).distinct
L'idée est que cela permettrait de créer un tableau de tous les Contact
modèles avec un unique :name
attribut. Cependant, c'est jeter cette erreur:
NoMethodError (private method 'select' called for Contact:Class)
Quel est le malentendu ici? Pour ce que ça vaut, la méthode de l'appel à cette ligne de code n'est pas définie dans le contrôleur comme privé.
EDIT:
Voici le code:
Contrôleur de
class FluidsurveysController < ApplicationController
def index
end
def import_contacts
@survey_provider = FluidsurveysProviders::SurveyProvider.new()
@current_month = Time.new.strftime("%B%Y%d")
fs_contact_list_array = csv_to_array(params[:file].tempfile)
@fs_contacts_array = []
fs_contact_list_array.each do |hash|
@fs_contacts_array << Contact.new(hash)
end
array = Contact.select(:name).distinct
end
end
Modèle
class Contact
include ActiveModel::Model
attr_reader :client_id, :client_name, :branch_id, :branch, :short_name, :unit_id, :membership_id,
:first_name, :last_name, :date_of_birth, :change_date_time, :membership_type,
:home_phone, :email_address, :anniversary_years
def initialize(fs_contact_hash = {})
@client_id = fs_contact_hash.fetch('ClientID')
@client_name = fs_contact_hash.fetch('ClientName')
@branch_id = fs_contact_hash.fetch('branchID1')
@branch = fs_contact_hash.fetch('branch')
@name = fs_contact_hash.fetch('ShortName')
@unit_id = fs_contact_hash.fetch('UnitID')
@membership_id = fs_contact_hash.fetch('MemberID')
@first_name = fs_contact_hash.fetch('FirstName')
@last_name = fs_contact_hash.fetch('LastName')
@date_of_birth = fs_contact_hash.fetch('DateOfBirth')
@change_date_time = fs_contact_hash.fetch('ChangeDateTime')
@membership_type = fs_contact_hash.fetch('MembershipType')
@home_phone = fs_contact_hash.fetch('HomePhone')
@email_address = fs_contact_hash.fetch('EMail1')
@anniversary_years = fs_contact_hash.fetch('Years')
end
end
- FWIW: les Rails de référence de l'API de membres de cette utilisation précises comme par exemple: api.rubyonrails.org/classes/ActiveRecord/...
- Vous avez écrit "n'est pas défini dans le controller en privé", tu veux dire modèle à la place?
- Non, je veux dire la méthode elle-même n'est pas une méthode privée. Cependant, aucun de mes attributs de modèle sont privés soit.
- Peut-être essayer
Contact.all.select(:name)
- Est votre Classe un ActiveRecord Objet?
- J'ai édité la question d'inclure plus d'informations.
- Votre classe n'est pas un ActiveRecord classe, voir ma réponse.
Vous devez vous connecter pour publier un commentaire.
Basé sur votre message d'erreur, je suis sûr que votre modèle n'est pas un ActiveRecord Objet.
Si vous souhaitez faire usage de
ActiveRecord#select
, de définir votre modèle de ce genre.Aussi, vous devez définir vos attributs dans une base de données au lieu de la via attr_reader accès par ActiveRecord. Voir http://guides.rubyonrails.org/getting_started.html#running-a-migration
Vous semblez être en utilisant une ancienne version de Rails, plus précisément de la version 2.3.quoi que ce soit. Là, le
select
méthode est en effet privé sur le ActiveRecord modèle de classes (comme elle est héritée de laKernel
module qui fait partie de chaque Ruby objet et sert un tout autre but) et donc n'est pas destiné à être utilisé comme c'est fait dans les Rails de Rails 3 et 4.Dans les Rails 2.3, vous pouvez obtenir des résultats similaires en utilisant cette syntaxe:
Cette retournera un tableau de Contacts qui n'ont plus que le nom de l'attribut.