Rails使用has_secure_password更新属性



我在一个项目中工作,用户可以使用admin: true / false。该应用程序只允许管理员用户登录系统,其他用户只是只有管理员才能编辑其设置的客户端。这是某种商业应用程序。(轨道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-zd-.]+.[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. 运行验证,即电子邮件验证

在使用CCD_ 13。以下是迄今为止的选项:

  1. update_attribute的使用(迄今为止最好)
    1.1 Pro:更新User
    1.2 Con:我必须为每个字段update_attribute(field1),因此需要更多的代码行
    1.3 Con:显然,这种方法在Rails4中已经不存在了,这是一个问题,以防将来需要升级
    1.4 Con:无验证
  2. @user.attributes=params[:user]在控制器方法中的使用
    2.1 Pro:一次更新多个字段
    2.2 Con:不更新User
  3. update_attributes的用户
    3.1 Pro:同时更新多个字段和表格
    3.2 Con:不工作(duh!)

建议?

看起来你只想在创建时验证密码的存在(还注意到验证密码确认的更简洁的方法):

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

然后可以使用update_attributes

您可能想通过使用强params:来限制可以提交的参数

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

相关内容

  • 没有找到相关文章

最新更新