【发布时间】:2014-10-26 03:47:52
【问题描述】:
为什么我无法更新 rails 中的 db 列? 数据库有一列 - 'remember_token' 但更新不起作用?
数据库迁移结果
....
....
....
== 20140830041234 AddRememberTokenToUsers: migrating ==========================
-- add_column(:users, :remember_token, :string)
-> 0.0010s
-- add_index(:users, :remember_token)
-> 0.0000s
== 20140830041234 AddRememberTokenToUsers: migrated (0.0030s) =================
rails 控制台 - 输出! remember_token 在直接分配后为零
irb(main):063:0* user
=> #<User id: 1, name: "Test", email: "hb@c.co", created_at: "2014-09-01 22:52:02", updated_at: "2014-09-01 22:52:02", p
assword_digest: "$2a$10$/66wO2dBte/xCXqxk.UAo.v.7.XZjsBFA3AerAWkHp16...", remember_token: nil>
irb(main):064:0> User.digest('asdasd')
=> "85136c79cbf9fe36bb9d05d0639c70c265c18d37"
irb(main):065:0> user.remember_token = User.digest('asdasd')
=> "85136c79cbf9fe36bb9d05d0639c70c265c18d37"
irb(main):066:0>
irb(main):067:0* user
=> #<User id: 1, name: "Test", email: "hb@c.co", created_at: "2014-09-01 22:52:02", updated_at: "2014-09-01 22:52:02", p
assword_digest: "$2a$10$/66wO2dBte/xCXqxk.UAo.v.7.XZjsBFA3AerAWkHp16...", remember_token: nil>
irb(main):068:0>
remember_token 在 update_attributes 后为零
irb(main):071:0> user.update_attributes(name: "Yahoo", remember_token: "will this get saved")
←[1m←[36m (0.0ms)←[0m ←[1mbegin transaction←[0m
←[1m←[35mUser Exists (1.0ms)←[0m SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('hb@c.co') AND "u
sers"."id" != 1) LIMIT 1
←[1m←[36mSQL (7.0ms)←[0m ←[1mUPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = 1←[0m [["name", "Y
ahoo"], ["updated_at", Mon, 01 Sep 2014 23:12:59 UTC +00:00]]
←[1m←[35m (8.0ms)←[0m commit transaction
=> true
irb(main):072:0>
irb(main):073:0* user
=> #<User id: 1, name: "Yahoo", email: "hb@c.co", created_at: "2014-09-01 22:52:02", updated_at: "2014-09-01 23:12:59",
password_digest: "$2a$10$/66wO2dBte/xCXqxk.UAo.v.7.XZjsBFA3AerAWkHp16...", remember_token: nil>
下面是模型
class User < ActiveRecord::Base
attr_accessor :remember_token
before_save { self.email = email.downcase }
before_create :create_remember_token
def User.new_remember_token
SecureRandom.urlsafe_base64
end
def User.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
end
以防万一——这里是控制器
class UsersController < ApplicationController
def new
@user = User.new
end
def show
@user = User.find(params[:id])
end
def create
#@user = User.new(params.require(:user).permit(:name, :email, :password, :password_confirmation)
@user = User.new(user_params)
if @user.save
# Handle a successful save.
flash[:success] = "Welcome #{@user.name} to the Sample App!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,:password_confirmation, :remember_token)
end
end
【问题讨论】:
-
你的模型看起来怎么样?你有任何回调吗?
-
嗨,有一个回调
class User < ActiveRecord::Base attr_accessor :remember_token before_save { self.email = email.downcase } before_create :create_remember_token
标签: ruby-on-rails ruby database ruby-on-rails-3