2015-07-12 50 views
1

validate_acceptance_of正在工作,但它不會將真正的數據保存到數據庫用戶列age_valid(如果選中)。validates_acceptance_of正在工作但未保存真正的用戶:age_valid在數據庫中

users.controller.rb

class UsersController < ApplicationController 
. 
. 
. 
private 

def user_params 
    params.require(:user).permit(:name, :birthdate, :email, :password, 
           :password_confirmation, :age_valid) 
end 
end 

_form.html.erb

<%= simple_form_for(@user) do |f| %> 
. 
. 
. 
<%= f.input :age_valid, 
      :as => :boolean, 
      :label => false, 
      :inline_label => 'I am 18 years of age or older.' %> 
. 
. 
. 
<% end %> 

user.rb

class User < ActiveRecord::Base 
    attr_accessor :remember_token, :age_valid 
. 
. 
. 
validates_acceptance_of :age_valid, 
     :acceptance => true, 
     :message => "You must verify that you are at least 18 years of age." 

這一切工作接受它並不會改變數據庫列「 age_valid「從false變爲true。我需要這個來保存記錄。

下面是翻譯DOM

<div class="form-group boolean optional user_age_valid"> 
    <div class="checkbox"> 
    <input value="0" type="hidden" name="user[age_valid]"> 
    <label><input class="boolean optional" type="checkbox" value="1" name="user[age_valid]" id="user_age_valid"> I am 18 years of age or older.</label> 
    </div> 
</div> 

遷移使用

class AddAgeValidToUser < ActiveRecord::Migration 
def change 
    add_column :users, :age_valid, :boolean, default: false 
end 
end 
+0

[我感覺你應該使用':accept'而不是':acceptance'。](http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_acceptance_of) – Makoto

+0

@Makoto如果我改變':接受'爲':接受'它拋出錯誤信息。 –

+0

您生成的表單的HTML外觀如何?可能是這種情況,它沒有正確填充表單樣式。 – Makoto

回答

0

下對我的作品。

user.rb

class User < ActiveRecord::Base 

validates_acceptance_of :age_valid, 
:accept => true, 
:message => "You must verify that you are at least 18 years of age." 

end 

new.html.erb

<%= simple_form_for @user, url: {action: "create"} do |f| %> 
<%= f.label :name %> 
<%= f.text_field :name %> 
<%= f.input :age_valid, 
     :as => :boolean, 
     :label => false, 
     :checked_value => true, 
     :unchecked_value => false, 
     :inline_label => 'I am 18 years of age or older.' %> 
<%= f.submit %> 

我刪除屬性訪問器,改變:acceptance => true,:accept => true並添加:checked_value => true,:unchecked_value => false

+0

這適用於創建和更新。數據庫現在顯示正確的保存值。真棒。 –

0

你不小心混在一起的兩個定義驗證的句法方式。

新語法:

validates :field, 
    property: {setting: "value"} 

舊語法:

validates_property_of :field, setting: "value" 

短的方式 - 從參數中刪除acceptance選項,因爲它是在方法的名稱已經說明。

如果你寧願喜歡一個新的語法,這裏是什麼樣子:

validates :age_valid, acceptance: {message: "..."} 

在這種特殊情況下有使用新的語法沒有收穫。但是,在其他情況下,它允許您使用多個條件驗證屬性,而不必重複它們或採用元編程。

說到代碼可維護性,保持一致性:選擇其中一個或另一個,並在項目中需要的地方使用它。

相關問題