使用has_secure_password Rails update_attributes

 Z张海男_851 发布于 2023-02-11 21:38

我正在一个用户可以拥有的项目中工作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编辑功能,但我只想允许编辑name,surnameemail.因此,我只提供以下形式的字段:

<%= 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.我正在考虑完成所有这些的最佳选择:

    @user使用新字段值更新对象.

    User表格中反映这一变化.

    运行验证,即电子邮件验证.

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

    使用update_attribute(最好到目前为止).
    1.1 Pro:更新User
    1.2 Con:我必须update_attribute(field1)为每个字段,所以更多的代码行
    1.3 Con:显然这种方法在Rails 4中不再存在,这是将来需要升级的问题.
    1.4骗局:没有验证

    使用的@user.attributes=params[:user]控制器方法
    2.1专业版同时更新多个字段:
    2.2 Con:不更新User表格.

    update_attributes
    3.1 Pro的用户:多个字段和表更新
    3.2 Con:不工作(呃!)

建议?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有