在Rails 3中部分更新模型

时间:2010-10-14 17:46:21

标签: ruby-on-rails

我是rails的新手并且有一个简单的问题。

我有一个铁轨模型:

class User < ActiveRecord::Base

  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation, :description 

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email,    :presence => true

  validates :name,     :presence => true

  validates :password, :presence => true

  ...

end

在此模型的更新页面上,我有一个表格,其中包含电子邮件的文本框和名称的文本框。

在我的控制器中我有以下更新方法:

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

  respond_to do |format|
    if @user.update_attributes(:name => params[:name], :email => params[:email])
      flash[:success] = "Profile updated"
      format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
      format.xml  { head :ok }
    else
      @title = "Edit user"
      format.html { render :action => "edit" }
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

这是一个奇怪的错误消息失败:

undefined method `downcase' for nil:NilClass

谁能告诉我这里哪里出错了?我确定我做的事情很糟糕,但无法弄清楚它是什么......

2 个答案:

答案 0 :(得分:2)

如果插入某种辅助方法,则可以有条件地触发验证。这通常适用于多阶段条目或部分更新:

class User < ActiveRecord::Base
  validates :password,
    :presence => { :if => :password_required? }

protected
  def password_required?
    self.new_record?
  end
end

我真的希望你不是将密码保存为纯文本。这是一个巨大的责任。通常passwordpassword_confirmation是临时attr_accessor方法,稍后进行哈希并保存。

答案 1 :(得分:1)

以下行错误

@user.update_attributes(params[:name], :email => params[:email])

update_attributes想要一个哈希值。

@user.update_attributes(:name => params[:name], :email => params[:email])

此外,您应该在视图中使用form_for帮助器,以便将所有用户属性分组为params[:user]哈希。