我有一个用户模型::name
,:email
,:password
这是我的表格:
<%= form_for(@user) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.text_field :password %>
<%= f.submit "Save" %>
<% end %>
我想显示没有:password
的表单,当我删除密码属性并提交表单时,字段不会在数据库中更新。我得到了回滚。
答案 0 :(得分:1)
您可以执行以下操作:
object.attribute = value
object.save(:validate => false)
这永远不会调用您的验证
但请记住,如果您的电子邮件和名称字段为空白,则永远不会验证它们。
答案 1 :(得分:0)
在我的用户模型中评论此行修复了此问题:
validates :password, length: { minimum: 6 }
但是,如评论中所述,这还不够。 用户可以编辑自己的个人资料,管理员可以编辑自己的个人资料。
这是一个解决方案:
def update
@user = User.find_by_id(params[:id])
if current_user?(@user)
if @user.update_attributes(user_params)
flash[:success] = "Your profile updated"
redirect_to @user
else
render 'edit'
end
else
if @user.update_attributes(admin_params)
flash[:success] = "Others profile updated"
redirect_to @user
else
render 'admin_edit_user'
end
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
def admin_params
params.require(:user).permit(:name, :email, :password) if current_user.admin?
end
答案 2 :(得分:0)
如果要跳过特定表单上特定属性的验证,可以执行以下操作。
Class User
attr_accessor :skip_password_validation
validate_presence_of :password, unless: -> { skip_password_validation }
end
这会创建一个可以设置和读取的虚拟属性,但不会在数据库中保留。
然后你可以以任何你想要的形式为:skip_password_validation
设置隐藏字段,它将跳过验证。
<%= f.hidden_field :skip_password_validation, value: true %>
您还必须将此参数添加到控制器中的user_params。