Venomoustoad Venomoustoad - 1 year ago 70
Ruby Question

Why does my rails rollback when I try to

I have installed the RailsTutorial sample app(the twitter like application) and am trying to understand why the following piece of console code does not update the database when I try updating the user db. I am expecting the user information to get updated once I use the
. However, this rolls back to unedited data. Is this due to a user based restriction?

Users controller:

class UsersController < ApplicationController

#before_filter :signed_in_user, only: [:index, :edit, :update, :destroy, :following, :followers]
# By default before filters apply to all actions
#before_filter :correct_user, only: [:edit, :update]
def edit
@user = User.find(params[:id])

def update

@user = User.find params[:id]

respond_to do |format|

if @user.update_attributes(params[:user])
flash[:notice] = "Profile updated"
format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
format.json { respond_with_bip(@user) }

format.html { render :action => "edit" }
format.json { respond_with_bip(@user) }


def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)

def admin_user
redirect_to(root_path) unless current_user.admin?


Rails console:

1.9.3-p392 :001 > user = User.find(109)

User Load (8.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 109]]
=> #<User id: 109, name: "laurie", email: "", created_at: "2013-09-26 18:10:12", updated_at: "2013-09-26 18:10:12", password_digest: "$2a$10$aXEtun8Z2Deqy2wNxvFRNOjPczKQkYc1vDezP5OduJuF...", remember_token: "YhIUhgFm9iMewxdNOHJ45A", admin: false>

1.9.3-p392 :002 > = "larry"
=> "larry"

1.9.3-p392 :003 >
(0.2ms) begin transaction
User Exists (0.6ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('') AND "users"."id" != 109) LIMIT 1
(0.1ms) rollback transaction
=> false

User model:

class User < ActiveRecord::Base

# Declaration of public variables
attr_accessible :email, :name, :password, :password_confirmation
has_many :microposts, dependent: :destroy
has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :followed_users, through: :relationships, source: :followed
has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy
has_many :followers, through: :reverse_relationships, source: :follower

before_save {email.downcase!}
before_save :create_remember_token

validates :name, presence: true, length: {maximum: 50}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false}
validates :password, presence: true, length: {minimum: 6}
validates :password_confirmation, presence: true
after_validation {self.errors.messages.delete(:password_digest)}

def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64

Answer Source

Your user model probably has validations which are not satisfied. Since you've not posted those I'm unable to really solve your question. To make live easier you can debug why your user isn't willing to save.

Try running


which should give you a hint what's going wrong.