Search code examples
ruby-on-railsrubytransactionsrollback

Rails Rollback Transaction


I have problems with my Rails Block. After I implemented a comment-section I am not able to create posts anymore. The console gives me a rollback transaction. So I did

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

It seems I have some validation problems with user :user=>["must exist"]. But before I implemented comments it did work. Can someone help me out?

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\/.*\Z/
end

Post-migrate

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

Solution

  • When you are creating a post you need to assign a user to that post in the create method under your posts controller. You could try something like this.

    def create
      if current_user
        @post.user_id = current_user.id
      end
    
      ## More create method stuff
    end
    

    By default, in a belongs_to association a user is required to create the post otherwise you will not be able to create the post. Since, from the looks of it, you do not have anything that assigns the user to that post in the create method.