I'm getting the error:
<NoMethodError: undefined method `read_attribute_for_serialization' for #<Record::ActiveRecord_Relation:0x007faa7cfe3318>>
代码片段的第三行出现了错误。
def artist
@records = Record.where('artist_id = ' + params[:artist_id])
render :json => @records, serializer: RecordSummarySerializer
end
这是控制器RecordsContrller的备用序列化程序。另一个名为'RecordsSerializer'的序列化程序可以正常工作。
对此错误进行搜索会出现一些解决方案。有些不清楚在哪里添加代码。另一个建议添加:
alias :read_attribute_for_serialization :send
将错误所在的类指向。对我来说没有用。我还查看了gem文档。我找到了一个使用serializer的示例:很明显不需要任何其他代码。
我正在使用Ruby 2.3.0和Rails 5.0.0。
控制器
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
Model
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
记录的模式
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
我刚刚注意到,在模式中没有出现主键id。当我查看表结构时,在Sequel Pro中可以看到它。
更新
我添加了@JMazzy建议的代码。现在我收到以下错误:
<NoMethodError: undefined method `id' for #<Record::ActiveRecord_Relation:0x007faa8005a9d8>\nDid you mean? ids>
Record.where('artist_id = ' + params[:artist_id])
这样的代码,因为它可能会导致 SQL 注入攻击。请改用Record.where(artist_id: params[:artist_id])
或者Record.where('artist_id = ?', params[:artist_id])
来替代。 - Leonel Galán