怪异的Rails问题。
我有一个Book
实体,用户可以Love
一本书。
我所有其他模型都很好,并通过了所有测试,但是在生成新的Love
模型并设置了固定装置之后,我突然发现了很多这些错误:
ActiveRecord::Fixture::FixtureError: table "books" has no column named "loves".
我以某种方式认为可能与Rails中的保留关键字有关?
Love
是否是保留关键字?我在此页面上进行了搜索:
https://reservedwords.herokuapp.com/
而单词
love
没有结果。爱迁移档案
class CreateLoves < ActiveRecord::Migration[5.0]
def change
create_table :loves do |t|
t.references :book, foreign_key: true
t.references :sender, foreign_key: true
t.references :receiver, foreign_key: true
t.timestamps
end
end
end
爱模型
class Love < ApplicationRecord
belongs_to :book
belongs_to :sender, class_name: "User"
belongs_to :receiver, class_name: "User"
end
爱治具
one:
book: one
sender: jim
receiver: sarah
two:
book: two
sender: sarah
receiver: jim
three:
book: three
sender: jim
receiver: tycus
书本模型
class Book < ApplicationRecord
belongs_to :author, class_name: "User"
has_and_belongs_to_many :genres
has_many :loves
end
书治具
one:
title: Back To The Future
adult_content: true
author: jim
published: false
genres: action, comedy, science_fiction
two:
title: Harry Potter and The Philosopher's Stone
adult_content: false
author: sarah
published: false
genres: action, fantasy
three:
title: Back To The Future 2
adult_content: true
author: jim
published: false
genres: action, comedy, science_fiction
four:
title: Back To The Future 3
adult_content: true
author: jim
published: false
genres: action, comedy, science_fiction
five:
title: Royal Guard
adult_content: true
author: chewedon
published: false
genres: action, romance, fantasy
图书管理员
class BooksController < ApplicationController
before_action :authenticate_user
after_action :verify_authorized, except: [:index, :create]
after_action :verify_policy_scoped, only: :index
def index
books = policy_scope(Book.all)
render json: books
end
def create
book = Book.new(book_params)
if book.save
render json: book, status: :created
else
render status: :unprocessable_entity
end
end
def show
book = Book.find_by(id: params[:id])
if book.present?
authorize book
render json: book
else
skip_authorization
render status: :not_found
end
end
def update
book = Book.find_by(id: params[:id])
skip_authorization and render status: :not_found and return unless book
authorize book
if book.update!(book_params)
render json: book
else
render status: :unprocessable_entity
end
end
def destroy
book = Book.find_by(id: params[:id])
skip_authorization and render status: :not_found and return unless book
authorize book
if book.destroy!
render status: :ok
end
end
private
def book_params
params.permit(:title, :adult_content, :published, :author_id, genre_ids: [])
end
end
这是我的其他一些型号及其测试夹具,它们都通过了测试:
本章装置
one:
title: Straw House
order: 1
content: First pig built a house out of straw
published: true
book: one
two:
title: Wooden House
order: 2
content: Second pig built a house out of wood
published: true
book: one
three:
title: Brick House
order: 3
content: Third pig built a house out of brick
published: false
book: one
four:
title: Hogwarts School of Wizardry
order: 1
content: They pushed their troller into nine and three quarters
published: false
book: two
评论夹具
one:
content: Love this chapter
author: jim
book: one
chapter: one
two:
content: Hate this chapter
author: sarah
book: two
chapter: two
three:
content: Interesting chapter
author: tycus
book: one
chapter: one
消息装置
one:
subject: Next Chapter
body: When will the next chapter be published?
sender_read: false
receiver_read: false
sender: jim
receiver: sarah
two:
subject: Film Adaptation
body: I would like to turn your story into a film
sender_read: false
receiver_read: false
sender: sarah
receiver: jim
three:
subject: Mind Blown
body: Where do you get all these ideas? I'll stalk you now!
sender_read: false
receiver_read: false
sender: tycus
receiver: jim
可能是什么问题呢?
更新资料
如果我注释掉我的恋爱装置:
# one:
# book: one
# sender: jim
# receiver: sarah
#
# two:
# book: two
# sender: sarah
# receiver: jim
#
# three:
# book: three
# sender: jim
# receiver: tycus
我收到新的测试错误:
Error:
BooksControllerTest#test_book_show_-_should_show_book_info:
NameError: uninitialized constant Book::Lofe
app/controllers/books_controller.rb:26:in `show'
test/controllers/books_controller_test.rb:63:in `block in <class:BooksControllerTest>'
Lofe
从何而来?我将“爱”的拼写检查了四倍。我什至在整个项目中搜索了“ Lofe”一词,但没有找到匹配的搜索结果。
最佳答案
大胆猜测,但我认为,这是因为Inflector
如何对待您的has_many :loves
行。
我认为它假定loves
中的单数是lofe
,因此是错误,因为它试图解析Lofe
类范围内的常量Book
。
要覆盖默认行为,请参阅文档的第一段代码:
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular 'octopus', 'octopi'
# for your case it's
inflect.irregular 'love', 'loves'
end