Rails form_for复选框验证,没有数据库中的记录

时间:2017-03-01 20:59:10

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我正在尝试创建一个必须接受一组条款和条件的用户注册表单,但我不知道如何使用复选框的值来验证它是否被点击(服务器端)。

我试过使用这个http://guides.rubyonrails.org/active_record_validations.html#acceptance,但到目前为止我还没有取得任何成果。

我的User.rb和我的表单validates :terms_of_service, acceptance: { accept: '1' }中有<%= f.check_box :terms_of_service,:value =>'0',:class =>"hidden", :id =>"t_and_c" %>,但我可以在不点击的情况下提交表单。我究竟做错了什么?如果我必须发布任何其他内容以使问题更容易理解,请告诉我。

2 个答案:

答案 0 :(得分:0)

在您的表单中,复选框在单击时应返回true。

在表单中,您只需指定是否选中该复选框:

$true

在您的控制器中,您只需保存从表单中返回的内容:

<%= f.check_box :terms_of_service %> Accept Terms of Services
check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")

在迁移中,我会为:terms_of_services添加一个默认选项,以使其更明确。

#you whitelist the parameter together with all the other params you have
 def user_params
    params.require(:user).permit(:terms_of_services)
 end

#You create your user as usual
def create
    @user = User.new(user_params)
end

修改

如果您未在用户模型中创建列,则无法使用服务器端的服务条款。只有在不创建列的情况下,您才能在客户端使用terms_of_servies。这就是你如何做到的:

创建一个没有Rails check_box帮助程序的复选框(因为它需要一个你没有的对象,因为数据库中没有列)

class AddTermsOfServicesToUser < ActiveRecord::Migration
  def change
    add_column :users, :terms_of_services, :boolean, default: false
  end
end

默认情况下禁用“提交”按钮

  <input type="checkbox" id="cbox1" value="accepted" onchange='enableSubmitTag(this)'>
  <label for="cbox1">Accept Terms of Services</label>

当他们点击服务条款复选框时,再次启用提交按钮。

<%= f.submit "Create", class: "btn btn-primary", id: "submit_button", disabled: true%>

如果您在表格中存储:terms_of_services,您也​​可以在服务器端验证它。你可以使用所有的JavaScript。您只需要更改复选框:

function enableSubmitTag(element) {
  if(element.checked){
    document.getElementById('submit_button').disabled = false; 
  } else {
    document.getElementById('submit_button').disabled = true;
  };
};

答案 1 :(得分:0)

模型应该有:

validates :terms_of_service, acceptance: true

表格应该有:

<%= form_for :user, url: users_path do |f| %>
  ...
  <%= f.label :terms_of_service %><br>
  <%= f.check_box :terms_of_service %>
  ...
<% end %>

和Rails应该为你做其他一切。