验证Rails中不在模型/控制器中的字段

时间:2012-03-08 12:27:02

标签: ruby-on-rails ruby validation

我是Rails的相对新手,请原谅我,如果我的问题有明显的答案。

我正在尝试在Rails表单中包含一个字段,该表单不在模型/控制器中或与视图关联的迁移中。

表单是一个简单的公共联系表单,我可以轻松地对大多数字段进行验证。例如姓名,电子邮件等。

模型是form_submission.rb

但是,我在联系表单中有一个字段 - captcha - 它没有在form_submissions db表中镜像,等等。

验证码有一个单独的表,模型等,它是captcha_answer.rb(等)

迁移中captcha_answer的属性是:answer和is_correct。

表格简单包含预定义问题的答案列表,其中一些是真的,一些是假的。

例如,验证码问题可能是:

这些是动物?

使用选项:cat,dog,tree,rabbit ..在选择中。

我希望能够做的是验证:

a)验证码字段存在于POST中(如果没有,则返回“no captcha given”的消息) b)给出的答案在captcha_answers.is_correct中的值为true(如果没有,则返回“你给错了答案”的消息)

capcha_answers.answer始终是唯一的,所以我想做一个SQL查询,它获取第一条记录,其中captcha_answers.answer =并返回captcha_answers.is_correct的值

就像我说的,如果属性在form_submissions中,那么我就可以验证它没有问题,但我无法弄清楚如何在另一个模型中对某些内容进行验证。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以添加一个隐藏字段并在控制器中捕获它:

在您的表单中:

<%= hidden_field(:signup, :pass_confirm, :value => 'abcd') %>

然后在控制器中:

params[:signup]

您可以访问其他模型并验证答案。

控制器中的动作如:

def update
    @company = Company.find(params[:id])

    puts "extra field:" 
    puts params[:signup]

    respond_to do |format|
      if @company.update_attributes(params[:company])
        format.html { redirect_to @company, :notice => 'Company was successfully updated.' }
        format.json { head :ok }
      else
        format.html { render :action => "edit" }
        format.json { render :json => @company.errors, :status => :unprocessable_entity }
      end
    end
  end

答案 1 :(得分:1)

为额外字段定义访问器并使用通常的ActiveRecord验证:

class MyModel < ActiveRecord::Base
  attr_accessor :extra_field

  validates :extra_field, :presence => true

  validate :custom_validation_method

  def custom_validation_method
    errors.add :extra_field, :invalid unless extra_field == "correct"
  end
end