2010-10-14 3 views
0

Я новичок в рельсах и имею простую проблему.Частичное обновление модели в Rails 3

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

class User < ActiveRecord::Base 

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

    email_regex = /\A[\w+\-.][email protected][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

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

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

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

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

update_attributes хочет хэш.

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

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

+0

извинения ... Это была опечатка. У меня есть хэш - я обновил вопрос. Я также использую form_for helper. Проблема в том, что у меня нет атрибута пароля в форме. Если я попробую @ user.update_attributes (params [: user]), он терпит неудачу, потому что требуется пароль. – Paul