我正在一个用户可以拥有的项目中工作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
,surname
和email
. 因此,我仅在表单中显示这些字段:
<%= 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 Pro中的使用:一次更新多个字段。
2.2 Con:不更新User
表。update_attributes
3.1 Pro的用户:多个字段和表更新
3.2 Con:不工作(duh!)
建议?