【问题标题】:Ruby on Rails - Adding a human security field into the simple_form gem?Ruby on Rails - 在 simple_form gem 中添加人类安全字段?
【发布时间】:2015-02-11 20:45:38
【问题描述】:

我目前在 Ruby on Rails 中使用 simple_form gem 创建了一个表单,但我想添加一种“什么是 1+1?”问题和输入字段作为最后一个问题,以消除机器人等风险。我如何将此功能添加到我的表单中?

我的表单包含以下内容:

<%= simple_form_for @job, html: { multipart: true } do |form| %>
  <h2>Job Position:</h2>
    <%= form.input :position, input_html: { maxlength: 60 }, placeholder: "Job Position", label: false %>
    <%= form.input :company, input_html: { maxlength: 60 }, placeholder: "Company name", label: false %>
    <%= form.input :salary, input_html: { maxlength: 60 }, placeholder: "Salary", label: false %>
    <%= form.input :contract, input_html: { maxlength: 60 }, placeholder: "Contract Type", label: false, collection: ['full time', 'part time', 'internship'], prompt: "Contract Type" %>
    <%= form.input :city, input_html: { maxlength: 60 }, placeholder: "City", label: false %>
    <%= form.input :expirydate, input_html: { maxlength: 60 }, placeholder: "Expiry date", label: false %>
    <%= form.input :description, input_html: { maxlength: 60 }, placeholder: "Full job description", label: false %>
    <%= form.input :apply, input_html: { maxlength: 60 }, placeholder: "How to apply", label: false %>
    <h2>Your Contact Details:</h2>
    <%= form.input :contactname, input_html: { maxlength: 60 }, placeholder: "Contact Name", label: false %>
    <%= form.input :contactemail, input_html: { maxlength: 60 }, placeholder: "Contact Email", label: false %>
    <%= form.input :contactphone, input_html: { maxlength: 60 }, placeholder: "Contact Telephone", label: false %>
    <%= form.button :submit %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您可以像这样向模型添加验证:

    class Job < ActiveRecord::Base
      attr_accessor :human_sum 
      validate :not_a_bot
    
      private
    
      def not_a_bot
        if human_sum.to_i != 2 
          errors.add(:human_sum, 'Get out, you bot!') 
        end
      end
    end
    

    然后以你的形式:

    <%= simple_form_for @job, html: { multipart: true } do |form| %>   
      ...
      <%= form.input :human_sum, label: 'What is 1+1?'
    <% end %> 
    

    不要忘记将:human_sum 添加到控制器中允许的参数中。

    【讨论】:

    • 如果您输入“2”的正确答案,那似乎不会发布帖子?我已将 job.rb 中的第一段代码放在我目前拥有的代码下方,并将表单输入放入创建字段的 new.html.erb 上的表单中,如果您输入了不正确的数字,则不会发布但同样,如果您确实正确使用数字“2”,它也不会发布。
    • 如果你输入了正确的答案('2'),那么human_sum.to_i将等于2,这反过来又不会给模型添加任何错误并且验证将通过。 @job 不会保存在您的控制器中,用户可能会返回到表单视图。如果您需要不同的行为,请澄清。
    • 如果我输入的答案不正确,它不会显示任何错误。如果答案是正确的,我希望它像我的原始代码一样发布帖子并重定向到索引,如果它不成功,那么我希望它留在 new.html.erb 但机器人输入上显示错误字段。
    • 我更新了我的答案,将错误放在正确的属性上(您不会在 :base 上打印错误)
    • 如果机器人字段被正确回答并且即使答案正确也会显示机器人错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多