部署我的应用时,我的评论出现问题。在当地一切正常。来自heroku的日志说:
ActiveModel::MissingAttributeError (can't write unknown attribute `user_id`):
2018-01-02T15:52:43.461794+00:00 app[web.1]: [79cd7190-e2d9-4dd0-bf71-
709552e5c6e5] app/controllers/comments_controller.rb:15:in `create'
我不知道发生了什么错误。也许是一些数据库的事情?
我的评论控件
class CommentsController < ApplicationController
def create
@post =Post.find(params[:post_id])
@comment =@post.comments.create(params[:comment].permit(:name, :body).merge(user: current_user))
redirect_to post_path(@post)
end
def destroy
@post = Post.find(params[:post_id])
@comment= @post.comments.find(params[:id])
if current_user.id == @comment.user_id
@comment.destroy
end
redirect_to post_path(@post)
end
end
我的模特
class User < ApplicationRecord
has_many :posts
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
class Post < ApplicationRecord
belongs_to :user, optional: true
has_many :comments, dependent: :destroy
validates :title, presence: true, length: {minimum: 5}
validates :body, presence: true
end
class Comment < ApplicationRecord
belongs_to :post
belongs_to :user
end
我的迁移文件
class CreateComments < ActiveRecord::Migration[5.1]
def change
create_table :comments do |t|
t.string :name
t.text :body
t.references :post, index: true
t.timestamps
end
end
end
如果您需要更多代码或有任何想法,请告诉我
编辑:如果我添加了user_id列,我会收到SQLite3::SQLException: duplicate column name: user_id: ALTER TABLE "comments" ADD "user_id" integer
错误
我的架构.rb
`create_table "comments", force: :cascade do |t|
t.string "name"
t.text "body"
t.integer "post_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.index ["post_id"], name: "index_comments_on_post_id"
end
create_table "posts", force: :cascade do |t|
t.string "title"
t.text "body"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
t.string "theme"
t.integer "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.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
答案 0 :(得分:2)
您需要在/t[·\-\.•]e/gi
表格中添加user_id
列。 comments
需要这个。您还需要belongs_to
列,post_id
表格user_id
。
您可以自定义列名称,但约定是使用格式posts
。
这是来自docs:
的关键引用使用宏式调用实现关联,以便您可以 以声明方式向模型添加功能。例如,通过声明 一个模型属于另一个,你指示Rails维护 两个实例之间的主键 - 外键信息 模型,你也可以添加一些实用方法 模型。
这意味着,例如,如果您的第一个用户的ID为parent_table_id
,则他们的所有评论和帖子的1
值均为user_id
,这与实际搭售记录在一起。
以下是包含相关行的示例迁移:
1
这有意义吗?如果您有任何问题,请告诉我,我可以根据需要进行更新:)
答案 1 :(得分:1)
您需要添加user_id
使用
创建迁移rails g migration AddUserIdToComment user:references
然后做
rake db:migrate
你应该没事。
答案 2 :(得分:1)
您的迁移已丢失
t.references :user, index: true
所以你需要在评论表中添加user_id列
更新:您似乎遇到了迁移问题。我建议您检查rake db:migrate:status
评论并查找任何向下迁移。完成所有操作后,只需运行rake db:migrate:down VERSION='VERSION_NUMBER_HERE'
并将您的用户t.references :user, index: true
添加到同一迁移中并进行迁移。
PS:当且仅当您没有推送时,才更改现有迁移。