奇怪的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
来自哪里?
我检查了我对Love的拼写的四倍。我甚至做了整个项目搜索单词&#34; Lofe&#34;并且它不会显示任何匹配的搜索结果。
答案 0 :(得分:5)
狂野猜测 ,但我认为,这是因为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
答案 1 :(得分:4)
@andreyDeineko是对的,如果你"loves".singularize
得到lofe
您可以覆盖rails在您的环境或应用程序中确定单数/复数的方式rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'love', 'loves'
end