Подтверждает принятие всегда терпит неудачу - PullRequest
31 голосов
/ 20 января 2011

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

В модели:

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 ]

101 голосов
/ 20 января 2011

Обновленный ответ ..

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

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

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

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

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

6 голосов
/ 24 сентября 2014

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

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

sign_up.html.erb

<%= f.check_box :terms_of_service %>

user.rb

validates, :terms_of_service, acceptance: true

Я забыл добавить: rules_of_service в моем сконфигурированном_параметре_параметров и разработал игнорирующее состояние флажка.1016 * 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 для определения того, какие параметры он должен сохранить в дополнение к электронной почте и паролю.

5 голосов
/ 17 марта 2011

Мне пришлось использовать этот формат:

validates :accpeted_terms, :acceptance => {:accept => true}
4 голосов
/ 26 апреля 2012
validates_acceptance_of :terms, :accept => true
1 голос
/ 07 марта 2016

Я пробовал это из Angular JS и Rails 4. Параметр угловой отправки со значением 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

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

1 голос
/ 22 января 2012

Я нашел ответ 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 %>
0 голосов
/ 16 августа 2014

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

<%= builder.check_box :agreement %>

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

validates :agreement, :acceptance => true

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

0 голосов
/ 20 января 2011

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

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