Проверяет, что прием всегда сбой
Я не вижу, что мне не хватает, но что-то явно не так.
В модели:
validates :terms, :acceptance => true, :on => :update
Попробуйте несколько вариантов:
>> a = Factory(:blog_agreement)
=> #<BlogAgreement id: 54, terms: false, created_at: "2011-01-20 11:33:03", updated_at: "2011-01-20 11:33:03", accept_code: "fa27698206bb15a6fba41857f12841c363c0e291", user_id: 874>
>> a.terms
=> false
>> a.terms = true
=> true
>> a.save
=> false
>> a.terms = "1"
=> "1"
>> a.save
=> false
>> a.terms = 1
=> 1
>> a.save
=> false
>> a.errors.full_messages
=> ["Terms must be accepted"]
Ответы
Ответ 1
Обновлен ответ..
Таким образом, оказывается, что проблема заключалась в том, что в качестве фактического столбца в таблице были условия. В общем случае validates_acceptance_of используется без такого столбца, и в этом случае он определяет атрибут доступа и использует его для его проверки.
Чтобы validates_acceptance_of работал, когда он сопоставляется с реальным столбцом таблицы, необходимо передать параметр: accept, например:
validates :terms, :acceptance => {:accept => true}
Причина этого связана с приведением типов в Active Record. Когда именованный атрибут фактически существует, AR выполняет typecasting на основе типа столбца базы данных. В большинстве случаев столбец приемника будет определен как логический, и поэтому model_object.terms
вернет true или false.
Когда нет такого столбца attr_accessor :terms
, просто возвращается значение, переданное объекту модели из хэша params, который обычно будет "1"
из поля флажка.
Ответ 2
Мне пришлось использовать этот формат:
validates :accpeted_terms, :acceptance => {:accept => true}
Ответ 3
В случае, если у кого-то есть такая же проблема, как у меня с умыслом, я добавляю этот ответ:
i добавлен в форму регистрации:
sign_up.html.erb
<%= f.check_box :terms_of_service %>
user.rb
validates, :terms_of_service, acceptance: true
я забыл добавить: terms_of_service внутри моих параметров configure_permitted_parameters и devize проигнорировал состояние флажка.
application_controller.rb
before_filter :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :terms_of_service)}
end
Метод configure_permitted_parameters используется при разработке, чтобы узнать, какие параметры он должен сохранить в дополнение к электронной почте и паролю.
Ответ 4
validates_acceptance_of :terms, :accept => true
Ответ 5
Я нашел ответ Candland выше, чтобы подтвердить правильность принятия в Rails 3.1. Вот как я настроил приложение Rails 3.1.3 для записи принятия в базу данных.
В процессе миграции
class AddTermsToAccount < ActiveRecord::Migration
def change
add_column :accounts, :terms_of_service, :boolean, :default => false
end
end
В модели
attr_accessible :terms_of_service
validates :terms_of_service, :acceptance => {:accept => true}
В форме
<%= f.check_box :terms_of_service %>
<%= f.label :terms_of_service %>
Ответ 6
Я пробовал это из Angular JS и Rails 4. Angular отправить параметр с true
, но рельсы не распознали true
.
Он может принимать параметр: accept, который определяет значение, которое будет считаются принятием. По умолчанию он равен "1" и может быть легко изменилось.
Итак, я перехожу к этому:
class Person < ActiveRecord::Base
validates :terms_of_service, acceptance: { accept: true }
end
Если у вас есть параметр по умолчанию 1
или 0
. Попробуйте сделать это:
class Person < ActiveRecord::Base
validates :terms_of_service, acceptance: true
end
Это для дополнительной документации. подтверждение принятия.
Надеюсь, это поможет вам.
Ответ 7
Вызов factory создает запись, поэтому ваши последующие вызовы для сохранения на самом деле являются обновлениями, поэтому ваша проверка не выполняется должным образом. Попробуйте без factory, и он должен работать.
Ответ 8
если у вас есть базовый флажок в вашем представлении, например
<%= builder.check_box :agreement %>
просто введите эту строку в свою модель
validates :agreement, :acceptance => true
который использует значение по умолчанию "1", сгенерированное помощником просмотра check_box