事务回滚:用户不存在

时间:2019-01-06 04:48:24

标签: ruby-on-rails ruby

我试图将作者的用户名添加到我博客中的帖子中,以便以后能够验证尝试更改该帖子的用户是该帖子的原始作者。但是,它不起作用,并且由于当前用户在页面上显示当前登录用户的用户名,因此即使当前用户确实存在,它也会返回错误“验证失败:用户必须存在”。< / p>

错误日志:

Validation failed: User must exist
@post = Post.new(post_params)
       @post[:author] = current_user.username
->>     if @post.save!
flash[:success] = "Post created."
redirect_to post_path(@post.id)
else

应用程序控制器(在其中声明current_user的地方):

class ApplicationController < ActionController::Base

helper_method :current_user
helper_method :require_user
def current_user
    return unless session[:user_id]
    current_user ||= User.find(session[:user_id])
end

def require_user 
  redirect_to '/login' unless current_user 
end

end

发布模型:

class Post < ApplicationRecord
    has_many :comments
    belongs_to :category
    belongs_to :user
end

模式:

  create_table "posts", force: :cascade do |t|
    t.string "title"
    t.integer "category_id"
    t.string "author"
    t.text "body"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

我执行Vasilisa所说的错误:

ActiveRecord::AssociationTypeMismatch (User(#47015106648260) expected, got "test" which is an instance of String(#47015080074780)):

  def create
    @post = current_user.posts.build(post_params)
    ==> @post.author = current_user.username
    if @post.save
    flash[:success] = "Post created."
    redirect_to post_path(@post.id)

1 个答案:

答案 0 :(得分:1)

帖子模型belongs_to :user,在ROR 5中,此关联会自动验证状态。这就是为什么您得到“验证失败:用户必须存在”的原因。看起来您想将帖子的用户存储为author在数据库中。

在迁移中更改您的帖子表

def change
  remove_column :posts, :author, :string
  add_reference :posts, :author
end

在“发布”模型中,将belongs_to :user更改为belongs_to :author, class_name: 'User'

添加到用户模型

has_many :posts, foreign_key: :author_id

之后,您只需在控制器中写入current_user.posts

def create
  @post = current_user.posts.build(post_params)
  if @post.save
    flash[:success] = "Post created."
    redirect_to post_path(@post.id)
  else
    render :new
  end
end

然后,请再次阅读有关associations in Rails

的信息