gpt4 book ai didi

ruby-on-rails - Rails update_attributes 使用 has_secure_password

转载 作者:行者123 更新时间:2023-12-04 05:39:07 24 4
gpt4 key购买 nike

我在一个项目中工作,用户可以拥有 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 编辑的功能,但是我只想允许编辑 namesurname电子邮件。因此,我仅以以下形式呈现这些字段:

<%= 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 时,我not 出乎意料地得到了验证password/password_confirmation 的错误,但由于我正在使用has_secure_password,数据库中不存在这些字段,只有password_digest。我正在考虑完成这一切的最佳选择:

  1. 用新字段值更新 @user 对象。
  2. User 表中反射(reflect)这一变化。
  3. 运行验证,即电子邮件验证。

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

  1. update_attribute 的使用(迄今为止最好的)。
    1.1 Pro:更新User
    1.2 缺点:我必须为每个字段update_attribute(field1),所以代码行更多
    1.3 Con:显然这个方法在Rails 4中已经不存在了,如果将来需要升级会出现问题。
    1.4 缺点:没有验证
  2. 在 Controller 方法中使用@user.attributes=params[:user]
    2.1 Pro:一次更新多个字段。
    2.2 Con:不更新 User 表。
  3. update_attributes 的用户
    3.1 Pro:同时支持多字段和表格更新
    3.2 缺点:不起作用(呃!)

建议?

最佳答案

看起来您只想在创建时验证密码是否存在(另请注意验证密码确认的更简洁方法):

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

然后您可以使用 update_attributes

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

关于ruby-on-rails - Rails update_attributes 使用 has_secure_password,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20475333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com