Подтвердить что ты не робот

Проверяет, что прием всегда сбой

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

В модели:

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

Ответ 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