Rails Validates предотвращает сохранение - PullRequest
3 голосов
/ 09 апреля 2011

У меня есть такая модель пользователя:

class User < ActiveRecord::Base
    validates :password, :presence => true,
                         :confirmation => true,
                         :length => { :within => 6..40 }
    .
    .
    .
end

В модели User у меня есть столбец billing_id, в который я хочу сохранить данные из контроллера OrdersController, который выглядит так:

class OrdersController < ApplicationController
    .
    .
    .
    def create
        @order = Order.new(params[:order])
        if @order.save
            if @order.purchase
                response = GATEWAY.store(credit_card, options)
                result = response.params['billingid']
                @thisuser = User.find(current_user)
                @thisuser.billing_id  = result
                if @thisuser.save
                        redirect_to(root_url), :notice => 'billing id saved')
                    else
                        redirect_to(root_url), :notice => @thisuser.errors)
                    end
            end
        end
    end

Из-за validates :password в модели User, @thisuser.save не сохраняется. Однако, как только я закомментирую проверку, @thisuser.save вернет true. Для меня это незнакомая территория, потому что я думал, что эта проверка работала только при создании нового пользователя. Может кто-нибудь сказать мне, если validates :password должен пнуть каждый раз, когда я пытаюсь сохранить в пользовательской модели? Спасибо

Ответы [ 2 ]

12 голосов
/ 09 апреля 2011

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

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

Альтернативой может быть условный запуск этого валидатора:

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

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

class User < ActiveRecord::Base
  def password_required?
    # Validation required if this is a new record or the password is being
    # updated.
    self.new_record? or self.password?
  end
end
0 голосов
/ 09 апреля 2011

Скорее всего, вы проверяете, что пароль был подтвержден (:confirmation => true), но подтверждение пароля не существует.

Вы можете разбить это на что-то вроде:

validates_presence_of :password, :length => { :within => 6..40 }
validates_presence_of :password_confirmation, :if => :password_changed?

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

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