当我尝试执行@user.update_attributes(params[:user])
时,我的用户已注销,或者似乎已注销。我收到了消息undefined method 'first_name' for nil:NilClass
。如果我回到我的主页,我会收到登录链接。为什么会这样?我已经阅读了stackoverflow,我需要包含attr_accessible :admin
,但这似乎没有任何帮助。
user.rb更新方法
def update
@user = User.find(params[:id])
if !params[:headshoturl].blank? then
@user.upload_headshot(params[:headshoturl])
end
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
迁移文件
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
## Token authenticatable
# t.string :authentication_token
# Custom changes
t.string :first_name
t.string :last_name
t.string :user_code
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
# add_index :users, :authentication_token, :unique => true
end
end
的routes.rb
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
resources :users
答案 0 :(得分:2)
params[:user]
是否包含password
和password_confirmation
?当您更新用户的密码时,Devise会将其签名。您可以在更新用户后编写自己的RegistrationsController
并执行sign_in @user, :bypass => true
来阻止此操作。
关于first_name错误,您能否确保first_name出现在schema.rb中?我想也许你已经在迁移运行后将它添加到DeviseCreateUsers
迁移中了。如果是这种情况,您需要创建新的迁移,请创建first_name及其中的任何其他字段,然后执行db:migrate。