【问题标题】:Rails 5 and ActiveModelSerializersRails 5 和 ActiveModelSerializers
【发布时间】:2016-03-03 21:09:53
【问题描述】:

我正在尝试了解 Rails 5 中的 ActiveModelSerializers。我正在关注这个 tutorial 并遇到了一些错误:

我可能不应该搞乱 Rails 5 beta 对吧?

rails -v
Rails 5.0.0.beta3

和鲁比:

ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin15]

这是我的架构:

ActiveRecord::Schema.define(version: 20160303205439) do

  create_table "rental_units", force: :cascade do |t|
    t.string   "address"
    t.integer  "rooms"
    t.integer  "bathrooms"
    t.integer  "price_cents"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "user_id"
  end

  add_index "rental_units", ["user_id"], name: "index_rental_units_on_user_id"

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "email"
  end

end

这是我的种子:

User.create(name: "1st user", email: "1stemail@gmail.com")
User.create(name: "2nd user", email: "2ndemail@gmail.com")
User.create(name: "3rd user", email: "3rdemail@gmail.com")

RentalUnit.create(address: "1st address", rooms: 2, bathrooms: 2, price_cents: 50000, user_id:1)
RentalUnit.create(address: "2nd address", rooms: 2, bathrooms: 2, price_cents: 50000, user_id:1)
RentalUnit.create(address: "3rd address", rooms: 2, bathrooms: 2, price_cents: 50000, user_id:1)
RentalUnit.create(address: "4th address", rooms: 2, bathrooms: 2, price_cents: 50000, user_id:2)

这是我的 RentalUnit 模型:

class RentalUnit < ApplicationRecord
end

这是我的 RentalUnitSerializer:

class RentalUnitSerializer < ActiveModel::Serializer
  attributes :id, :address, :rooms, :bathrooms, :price, :price_per_room
  belongs_to :user
end

当我尝试运行 rails server 时,我得到:

rs
=> Booting Puma
=> Rails 5.0.0.beta3 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/Users/Jwan/Dropbox/programming/rails/api_codeship/app/serializers/rental_unit_serializer.rb:3:in `<class:RentalUnitSerializer>': undefined method `belongs_to' for RentalUnitSerializer:Class (NoMethodError)
    from /Users/Jwan/Dropbox/programming/rails/api_codeship/app/serializers/rental_unit_serializer.rb:1:in `<top (required)>'
...

知道发生了什么吗?

谁有关于 API 设计、Rails API 和 AMS 的好的教程?

【问题讨论】:

    标签: active-model-serializers ruby-on-rails-5


    【解决方案1】:

    您的RentalUnit 模型中缺少has_onehas_many 关系(可能还有User 模型)。根据您的需要,在您的 RentalUnit 模型中添加 belongs_to :user 并在您的 User 模型中添加 has_onehas_many

    我正在使用 Rails 5beta2 和 ActiveModel Serializer,它运行良好......猜测 beta3 应该只会更好。

    【讨论】:

    • 原来是RentalUnitSerializer中的belongs_to不够用?
    • 正确,因为序列化程序采用模型并将其转换为 JSON。如果模型没有user_id 字段,则没有数据可以说明它属于哪个用户。
    • 那么,belongs_to :user 在序列化器中做了什么?
    • 比较带有和不带有belongs_to的JSON响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多