【发布时间】:2021-05-04 10:14:25
【问题描述】:
在 Rails 中收到此错误: PG::NotNullViolation:错误:“reviewer_id”列中的空值违反非空约束详细信息:失败行包含(26、2222、2222、8、null、2021-01-30 19:26:03.354983、2021-01- 30 19:26:03.354983)。
此应用试图允许用户给其他用户评论。 我是新手,所以错误可能很明显,但对于未经训练的眼睛来说不是。经过数小时的研究,这是我最后的手段。 我会很感激帮助解决这个问题。上帝保佑。
routes.rb
resources :users do
resources :reviews, only: [ :new, :create ]
end
reviews_controller.rb
def create
@review = Review.new(review_params)
@review.user_id = current_user.id
if @review.save
redirect_to user_path(current_user), notice: 'Review added!'
else
render :new
end
end
private
def review_params
params.require(:review).permit(:rating, :content)
end
schema.rb
create_table "reviews", force: :cascade do |t|
t.text "content"
t.integer "rating"
t.bigint "user_id", null: false
t.bigint "reviewer_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["reviewer_id"], name: "index_reviews_on_reviewer_id"
t.index ["user_id"], name: "index_reviews_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.inet "current_sign_in_ip"
t.inet "last_sign_in_ip"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "username"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
t.index ["username"], name: "index_users_on_username", unique: true
end
add_foreign_key "offers", "games"
add_foreign_key "offers", "users"
add_foreign_key "rentals", "offers"
add_foreign_key "rentals", "users"
add_foreign_key "reviews", "users"
add_foreign_key "reviews", "users", column: "reviewer_id"
user.rb
has_many :reviews, dependent: :destroy
has_many :given_reviews, source: :reviews, foreign_key: :reviewer_id
has_many :received_reviews, source: :reviews, foreign_key: :user_id
review.rb
belongs_to :user
validates :content, presence: true
validates :rating, presence: true
【问题讨论】:
-
你在哪里设置
reviewer_id?您允许评论的唯一两个参数是评分和内容。 -
听起来你想做
@review.reviewer = current_user。你有没有故意的user和reviewer?他们不一样吗?
标签: ruby-on-rails model-view-controller error-handling schema