使用has_secure_password Rails update_attributes

我正在一个用户可以拥有admin: true / false的项目中工作。 该应用程序只允许管理员用户登录系统,其他用户只是其设置只有管理员可以编辑的客户端。 这是某种商业应用程序。( Rails 3.2.13

我想将这两个概念保存在同一个表中,因为将来可能会选择登录非管理员用户并与他们的配置文件进行交互,因此所有逻辑都已经实现。

我有这个User资源:

 ActiveRecord::Schema.define(:version => 20131204200554) do create_table "users", :force => true do |t| t.string "name" t.string "surname" t.boolean "admin" t.string "password_digest" t.string "email" t.string "auth_token" end end 

这是用户模型:

 class User < ActiveRecord::Base has_secure_password attr_accessible :name, :surname,:email, :password, :password_confirmation validates :name, presence:true, length: { maximum:50} validates :first_surname, presence:true, length: { maximum:50} VALID_EMAIL_REGEX= /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i validates :email, presence: true,format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive:false} validates :password, length:{minimum:6} validates :password_confirmation, presence:true before_save{ self.email.downcase! } before_save :generate_auth_token private def generate_auth_token self.auth_token=SecureRandom.urlsafe_base64 end end 

我正在尝试实现User编辑的function,但我只想允许编辑namesurnameemail 。 因此,我只提供表格中的那些字段:

         

我试图用这段代码完成目标:

 def update @user = User.find(params[:id]) if @user.update_attributes(params[:user]) # Handle a successful update. flash[:success]="User updated successfully" redirect_to @user else flash[:danger]="Error updating user" render 'edit' end end 

我的问题是,当尝试update_attributes没有意外地validationpassword/password_confirmation ,但由于我使用的是has_secure_password ,因此数据库中不存在这些字段,只有password_digest 。 我正在考虑完成所有这些的最佳选择:

  1. 使用新字段值更新@user对象。
  2. User表中反映此更改。
  3. 运行validation,即电子邮件validation。

使用has_secure_password 。 到目前为止这些是选项:

  1. 使用update_attribute (目前为止最好)。
    1.1 Pro :更新User
    1.2 Con :我必须为每个字段更新update_attribute(field1) ,因此需要更多行代码
    1.3 Con :显然这种方法在Rails 4中不再存在,这是将来需要升级的问题。
    1.4 Con :无validation
  2. 在控制器方法中使用@user.attributes=params[:user]
    2.1 Pro :一次更新多个字段。
    2.2 Con :不更新User表。
  3. update_attributes用户
    3.1 Pro :多个字段和表更新
    3.2骗局 :不工作(呃!)

建议?

看起来您只想在创建时validation密码的存在(还要注意更简洁的方式来validation密码确认):

 validates :password, length:{minimum:6}, confirmation: true, on: :create 

然后,您可以使用update_attributes

您可能希望使用强参数来限制可以提交的参数:

  • gem: https : //github.com/rails/strong_parameters
  • 也包含在Rails 4中http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html