Rails, метод обновления и валидация - PullRequest
1 голос
/ 01 марта 2012

У меня проблема, и мне нужна идея, как исправить мой метод обновления.У меня есть админ-панель, где я могу создавать пользователей.Эта форма включает в себя имя, адрес электронной почты, пароль, поля повторяющихся паролей, и она отлично работает.Затем я хочу иметь список всех пользователей и редактировать тех, кого я хочу.Проблема в том, что я хочу редактировать часть информации, которая не включена в форму регистрации и по умолчанию пуста.В режиме редактирования моя форма имеет два новых поля - примечания и пропуски.Когда я изменяю эти поля и вызываю метод обновления, я вижу сообщение о том, что пароль и повторный пароль не совпадают, что является проверкой при регистрации, но у меня нет этих файлов в режиме редактирования.Как я мог решить эту проблему.Это часть моего кода:

class UsersController < ApplicationController
  def edit
    @user = User.find(params[:id])
    @title = "Edit user"
  end

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:user])
    flash[:success] = "Profile updated."
    redirect_to @user
  else
    @title = "Edit user"
    render 'edit'
  end
end


class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation
  validates :name,  :presence => true,
                :length   => { :maximum => 50 }
  validates :email, :presence => true

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

  validates :email, :presence   => true,
            :format     => { :with => email_regex },
            :uniqueness => true

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

  before_save :encrypt_password

  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
  end

  def self.authenticate_with_salt(id, cookie_salt)
    user = find_by_id(id)
    (user && user.salt == cookie_salt) ? user : nil
  end

  private

  def encrypt_password
    self.salt = make_salt unless has_password?(password)
    self.encrypted_password = encrypt(password)
  end

  def encrypt(string)
    secure_hash("#{salt}--#{string}")
  end

  def make_salt
    secure_hash("#{Time.now.utc}--#{password}")
  end

  def secure_hash(string)
    Digest::SHA2.hexdigest(string)
  end
end

1 Ответ

0 голосов
/ 01 марта 2012

Проверка наличия пароля верна, когда вы создаете пользователя, но если у пользователя есть зашифрованный пароль, вы не хотите, чтобы он присутствовал во всех отправках формы в будущем.

Активная запись поддерживает добавление условий к проверкам, поэтому я бы предложил поставить условие проверки пароля, чтобы оно выполнялось только в том случае, если у объекта пользователя еще нет зашифрованного пароля. Соответствующий фрагмент будет:

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

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