Rails回滚事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails回滚事务相关的知识,希望对你有一定的参考价值。

我的Rails Block有问题。在我实施评论部分后,我无法再创建帖子了。控制台给我一个回滚事务。所以我做了

p = Post.new
p.valid? # false
p.errors.messages

看来我对用户:user=>["must exist"]有一些验证问题。但在我实施评论之前,它确实有效。有人可以帮我吗?

User.rb

class User < ApplicationRecord
  has_many :posts
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable
end

Post.rb

class Post < ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy

  validates :title, presence: true, length: {minimum: 5}
  validates :body, presence: true


  has_attached_file :image  #, :styles => { :medium => "300x300>", :thumb => "100x100>" }
  validates_attachment_content_type :image, :content_type => /Aimage/.*/
end

后迁移

class CreatePosts < ActiveRecord::Migration[5.1]
  def change
     create_table :posts do |t|
     t.string :title
     t.text :body

     t.timestamps
     end
   end
 end

Post_controller

class PostsController < ApplicationController
  def index
    @posts = Post.all.order("created_at DESC")
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to @post
    else
      render 'new'
    end
  end

  def show
    @post = Post.find(params[:id])
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @post = Post.find(params[:id])

    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
    end
  end

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    redirect_to posts_path
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, :theme)
  end
end
答案

在创建帖子时,您需要在帖子控制器下的create方法中为该帖子分配用户。你可以尝试这样的事情。

def create
  if current_user
    @post.user_id = current_user.id
  end

  ## More create method stuff
end

默认情况下,在belongs_to关联中,用户需要创建帖子,否则您将无法创建帖子。因为从它的外观来看,你没有任何东西可以在create方法中将用户分配给该帖子。

以上是关于Rails回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PG Ruby Gem有条件地回滚事务

使用(restful)rails 时事务何时开始

Rails 3:将 ActiveRecord 操作和外部信用卡包装在单个事务中

使用栈处理回滚

ThinkPHP 实现数据库事务回滚示例代码

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?