<NoMethodError: undefined method `read_attribute_for_serialization' #<Record::ActiveRecord_Relation:
J'obtiens le message d'erreur:
<NoMethodError: undefined method `read_attribute_for_serialization' for #<Record::ActiveRecord_Relation:0x007faa7cfe3318>>
L'erreur est sur la troisième ligne de l'extrait.
def artist
@records = Record.where('artist_id = ' + params[:artist_id])
render :json => @records, serializer: RecordSummarySerializer
end
C'est une autre sérialiseur pour le contrôleur RecordsContrller. L'autre, 'RecordsSerializer, fonctionne très bien.
Une recherche sur cette erreur a quelques solutions. Certains n'étaient pas claires quant à l'endroit où on pourrait ajouter le code. Un autre a suggéré d'ajouter:
alias :read_attribute_for_serialization :send
à la classe où l'erreur se produit. Il n'a pas de travail pour moi. J'ai aussi regardé à travers le joyau de la documentation. J'ai trouvé un exemple de l'utilisation de sérialiseur:. Il était clair tout autre code était nécessaire.
Je suis en utilisant Ruby 2.3.0 et les Rails 5.0.0.
Contrôleur
class RecordsController < ApplicationController
...
def index
@records = Record.order('title')
render :json => @records
end
def artist
@records = Record.where('artist_id = ' + params[:artist_id])
render :json => @records, serializer: RecordSummarySerializer
end
...
end
Modèle
class Record < ActiveRecord::Base
belongs_to :artist
belongs_to :label
belongs_to :style
has_many :tracks
has_many :credits
validates :title, presence: true
validates :catalog, presence: true
end
record_summary_serializer.rb
include ActiveModel::Serialization
class RecordSummarySerializer < ActiveModel::Serializer
attributes :id, :artist_id, :label_id, :style_id, :title, :catalog,
:recording_date, :penguin, :category
end
record_serializer.rb
class RecordSerializer < ActiveModel::Serializer
attributes :id, :artist_id, :label_id, :style_id, :title, :catalog, :alternate_catalog,
:recording_date, :notes, :penguin, :category
has_one :artist
has_many :tracks
end
Schéma pour les Enregistrements
create_table "records", unsigned: true, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
t.string "title", limit: 50
t.string "catalog", limit: 20, null: false
t.string "alternate_catalog", limit: 20
t.integer "artist_id", unsigned: true
t.integer "label_id", null: false, unsigned: true
t.integer "style_id", unsigned: true
t.datetime "recording_date"
t.text "notes", limit: 4294967295
t.string "penguin", limit: 50
t.string "category", limit: 50, default: "jazz"
t.index ["artist_id"], name: "RecordHasOneArtist", using: :btree
t.index ["label_id"], name: "RecordHasOneLabel", using: :btree
t.index ["style_id"], name: "RecordHasOneStyle", using: :btree
end
J'ai juste remarqué, la clé primaire, id, n'apparaît pas dans le schéma. Je le vois dans Sequel Pro quand j'ai vue la structure de la table.
Mise à jour
J'ai ajouté le code suggéré par @JMazzy. Maintenant, je reçois l'erreur:
<NoMethodError: undefined method `id' for #<Record::ActiveRecord_Relation:0x007faa8005a9d8>\nDid you mean? ids>
Record.where('artist_id = ' + params[:artist_id])
dans la production, car il pourrait ouvrir votre application à l'Injection SQL. Utilisation: Record.where(artist_id: params[:artist_id])
ou Record.where('artist_id = ?', params[:artist_id])
à la place.OriginalL'auteur curt | 2016-07-21
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même message d'erreur et trouvé évolution
serializer:
àeach_serializer:
dans le contrôleur a résolu le problème.Contrôleur
record_summary_serializer.rb - pouvez supprimer la ligne include
De active_model_serializers la documentation.
Lien mis à jour. grâce Lowryder
serializer
àeach_serializer
a fonctionné pour moi. Merci!Doc lien est mort, voici un nouveau: github.com/ggordon/active_model_serializers/blob/master/...
OriginalL'auteur Kem
Vous devez ajouter
include ActiveModel::Serialization
à votre modèle. Étendue de la sérialisation n'est pas inclus par défaut dans Activerecord. Voir cette réponse sur GitHub.Résolu mon problème, merci!
Résolu le mien aussi, merci beaucoup JMazzy
OriginalL'auteur JMazzy
Cette erreur peut se produire lorsque l'objet est sérialisé
nil
. Envisager d'impression de débogage de l'objet que vous sérialisation pour vérifier si il estnil
:Si l'objet (
product
dans l'extrait ci-dessus) estnil
, vous pouvez voir l'NoMethodError
signalé ci-dessus en raison denil.read_attribute_for_serialization
appelé.OriginalL'auteur Eliot Sykes
J'ai résolu mon problème immédiat par l'évolution de la coutume sérialiseur pour RecordDetailSerializer et l'appeler à partir de mon spectacle de la méthode dans le contrôleur. Quand j'ai enlevé le comprennent @JMazzy a suggéré qu'il travaillait encore. Il y a toujours quelque chose de tordu. Si j'utilise la méthode personnalisée dans la méthode de l'indice:
Je reçois le message d'erreur sur l'id manquant apparaît au bas de ma question ci-dessus. Cependant, lorsque je l'utilise dans mon show méthode:
Si je supprime le problème de champ, le champ suivant dans la liste devient le problème. Ce n en est plus un problème pour moi, car je peux toujours limitée personnalisé sérialiseurs et des éléments individuels.
OriginalL'auteur curt