我正在尝试创建一个必须接受一组条款和条件的用户注册表单,但我不知道如何使用复选框的值来验证它是否被点击(服务器端)。
我试过使用这个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" %>
,但我可以在不点击的情况下提交表单。我究竟做错了什么?如果我必须发布任何其他内容以使问题更容易理解,请告诉我。
答案 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应该为你做其他一切。