form_for省略@user模型中的特定字段

时间:2014-04-19 18:16:16

标签: ruby-on-rails

我有一个用户模型::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的表单,当我删除密码属性并提交表单时,字段不会在数据库中更新。我得到了回滚。

3 个答案:

答案 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。