如何仅更新rails中的部分属性,而不是全部

时间:2011-11-01 12:25:44

标签: ruby-on-rails ruby ruby-on-rails-3.1

我有一个用于更新某些属性的编辑表单。但是它试图编辑所有属性,并且导致这个我有验证错误。

我的表单(编辑视图)

#person_info.fl_l
  - if @user.errors.any?
    .error_explanation
      %h2 Form is invalid
      %ul
        -for message in  @user.errors.full_messages
          %li= message


  =form_for @user do |f|
    %p
      Birthday:
      %br
      = f.date_select(:birthday,:start_year => 1940)
    %p
      Name:
      %br
      = f.text_field :name, :value=>@user.name
    %p
      Surname:
      %br
      = f.text_field :surname, :value=>@user.surname
    %p
      Nickname:
      %br
      = f.text_field :nickname, :value=>@user.surname       
    %p
      About Myself:
      %br
      = f.text_area :about_myself, :value=>@user.about_myself
    %p
      = f.submit "Update"

我的更新和修改操作:

def edit
      @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      redirect_to @user
    else
      render 'edit'
    end
  end

当我提交表单时,它会输出验证错误,例如:“密码不能为空”

那么,如何仅更新部分属性,而不是全部?我不想在我的情况下更新密码。

我的用户模型

class User < ActiveRecord::Base

  has_many :posts
  has_many :sent_messages, :class_name => "Message", :foreign_key => "sender_id"
  has_many :received_messages, :class_name => "Message", :foreign_key => "receiver_id"
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password
  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, :presence => true,
            :length => {:maximum => 50}
  validates :email, :presence => true,
            :format => {:with => email_regex},
            :uniqueness => {:case_sensitive => false}

  validates :password, :presence => true,
            :confirmation => true,
            :length => {:within => 6..40}


  before_create { generate_token(:auth_token) }

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end

  def generate_token(column)
    begin
      self[column] = SecureRandom.urlsafe_base64
    end while User.exists?(column => self[column])
  end
end

5 个答案:

答案 0 :(得分:1)

从params哈希

中删除它
params.delete(:password)

或构建您自己的哈希以发送更新。

答案 1 :(得分:1)

结帐Authentication in Rails 3.1以平滑您的身份验证。它从你的模型中取出了很多代码。

然后,我注意到:如果由于任何原因从表单隐藏字段,则rails不会在params哈希中传递此更新。因此,您可以在表单中隐藏字段。这就是我解决的问题。

答案 2 :(得分:1)

我通过附加

解决了这个问题
,:on => :create

到我的validates_presence_of和validates_length_of行。

答案 3 :(得分:0)

我已经在用户密码验证中解决了这个问题,如下所示:

validates :password, :presence     => true,
                     :confirmation => true,
                     :if           => :password # only validate if password changed!

答案 4 :(得分:0)

我相信你的模型在当前状态下无效......你没有输入密码,所以Rails没有触及那个属性。

在rails控制台中,测试:

user = User.find(whatever_the_id_is)
puts user.valid?
puts user.errors.inspect

我的假设是,由于密码丢失,它无效。