使用has_secure_password Rails update_attributes

时间:2013-12-09 16:16:38

标签: ruby-on-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+\-.]+@[a-z\d\-.]+\.[a-z]+\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编辑的功能,但我只想允许编辑namesurnameemail。因此,我只提供以下形式的字段:

<%= form_for(@user) do |f| %>
  <%= f.label :name,"Name" %>
  <%= f.text_field :name %>
  <%= f.label :surname,"Surname" %>
  <%= f.text_field :surname %>
  <%= f.label :email,"Email" %>
  <%= f.text_field :email %>
  <%= f.submit "Save" %>

我正在尝试使用此代码完成目标:

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时,我意外地 错误验证password/password_confirmation,但由于我正在使用has_secure_password,这些字段会数据库中不存在,只有password_digest。我正在考虑实现这一切的最佳选择:

  1. 使用新字段值更新@user对象。
  2. User表格中反映此更改。
  3. 运行验证,即电子邮件验证。
  4. 使用has_secure_password时。到目前为止,这些是选项:

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

1 个答案:

答案 0 :(得分:8)

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

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

然后,您可以使用update_attributes

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