который использует значение по умолчанию «1», сгенерированное помощником вида check_box

вижу, что мне не хватает, но что-то явно не так.

В модели:

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"]

Ответы на вопрос(8)

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

 noodl20 янв. 2011 г., 14:30
Но она принимает условия, и проверка по-прежнему не проходит.

если у кого-то есть такая же проблема, как у меня с устройством, я добавляю этот ответ:

я добавил в регистрационную форму устройства:

sign_up.html.erb

<%= f.check_box :terms_of_service %>

user.rb

validates, :terms_of_service, acceptance: true

я забыл добавить: term_of_service внутри моего сконфигурированного_параметра и разработал игнорировать состояние флажка.

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 Метод используется компанией devise для определения того, какие параметры он должен сохранить, кроме адреса электронной почты и пароля.

 jameshwart lopez21 июл. 2015 г., 12:08
я попробовал ваш ответ, но не получил желаемого результата
 Ayoros22 июл. 2015 г., 22:34
Мне нужно знать больше о вашей проблеме. Вы можете создать новый вопрос с вашим кодом и разместить здесь URL. Я буду рад помочь вам ;)
Решение Вопроса
Обновленный ответ ..

получается, что проблема заключалась в том, что термины были в виде фактического столбца в таблице. В общем случае validates_acceptance_of используется без такого столбца, и в этом случае он определяет средство доступа к атрибуту и ​​использует его для своей проверки.

Чтобы validates_acceptance_of работал, когда он отображается на столбец реальной таблицы, необходимо передать параметр: accept, например:

validates :terms, :acceptance => {:accept => true}

Причина этого связана с приведением типов в Active Record. Когда указанный атрибут действительно существует, AR выполняет приведение типов на основе типа столбца базы данных. В большинстве случаев столбец принятия будет определен как логическое значение, и поэтомуmodel_object.terms вернет истину или ложь.

Когда такой колонки нетattr_accessor :terms просто возвращает значение, переданное объекту модели из хэша params, который обычно будет"1" из поля флажка.

 noodl20 янв. 2011 г., 15:55
Просто читая код для AcceptanceValidator, кажется, что вы можете использовать его, когда атрибут отображается на столбец базы данных. Чтобы это сработало, нужно сдать:accept => true при объявлении проверки. Видеть:github.com/rails/rails/blob/master/activemodel/lib/active_model/...
 noodl20 янв. 2011 г., 15:20
Здорово. Вы можете сохранить свой столбец БД для терминов и использовать другой валидатор, но на самом деле, если допустить, что пользовательские записи могут быть созданы только тогда, когда термины приняты, тогда в этом нет особой необходимости.
 user58287420 янв. 2011 г., 15:34
Ах, я рассуждал о том, что объект создается администратором, тогда конечный пользователь принимает соглашение (следовательно, проверка условий только при обновлении). Я также хочу сохранить, были ли они приняты или нет. Это круто, я могу исправить это отсюда, просто было бы очень коротким и простым, если бы это работало
 Jeff16 сент. 2014 г., 18:05
Для таких как я, наоборот, меняются:acceptance => {:accept => true} в:acceptance => true если у вас нет столбца в базе данных.
 user58287420 янв. 2011 г., 15:17
Благодарю. Doh! Да, я не осознавал, что это былотолько для виртуальных полей. Но да, Factory (: что угодно) создает объект, тогда я обновлял его в приведенных выше примерах.

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

Это для дополнительной документации.подтверждение приемки, Я надеюсь, что это поможет вам.

validates_acceptance_of :terms, :accept => true
 Eric03 июл. 2013 г., 22:17
Другие ответы не работают с Rails 3. Этот ответ работает отлично.

validates :accpeted_terms, :acceptance => {:accept => true}
 Martin Carel09 авг. 2015 г., 19:18
Но, скорее всего, без опечатки в вашем проверенном атрибуте, так как в настоящее время он читается какaccpeted_terms.
 rigyt24 апр. 2017 г., 12:49
У меня были проблемы с этим в Postgres. Руководство Rails говорит, что принятие: true по умолчанию принимает значения ['1', true]. Но добавление (accept: true} эффективно удаляет «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 %>

если у вас есть основной флажок в вашем представлении, например,

<%= builder.check_box :agreement %>

просто поместите эту строку в вашу модель

validates :agreement, :acceptance => true

который использует значение по умолчанию «1», сгенерированное помощником вида check_box

Ваш ответ на вопрос