Частично обновление модели в Rails 3 - PullRequest
0 голосов
/ 14 октября 2010

Я новичок в рельсах и у меня есть простая проблема.

У меня есть модель рельсов:

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 ]

2 голосов
/ 14 октября 2010

Вы можете запустить проверку условно, если вставите какой-нибудь вспомогательный метод.Обычно это относится к многоступенчатым записям или частичным обновлениям:

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

protected
  def password_required?
    self.new_record?
  end
end

Я действительно надеюсь, что вы не сохраните пароль в виде обычного текста.Это огромная ответственность.Обычно password и password_confirmation - это временные attr_accessor методы, которые затем хэшируются и сохраняются.

1 голос
/ 14 октября 2010

Следующая строка неверна

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

update_attributes хочет хеш.

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

Кроме того, вы должны использовать form_for помощник в ваших представлениях, чтобы все ваши пользовательские атрибуты былисгруппированы в хэш params[:user].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...