Ruby on rails 验证非';t在Rails中的模型/控制器中

Ruby on rails 验证非';t在Rails中的模型/控制器中,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我是Rails的新手,所以如果我的问题有明显的答案,请原谅我 我试图在Rails表单中包含一个字段,该字段不在模型/控制器或与视图关联的迁移中 该表单是一个简单的公共联系人表单,我可以很容易地对大多数字段进行验证。例如姓名、电子邮件等 模型为form_submission.rb 但是,我在联系人表单中有一个字段——captcha——它没有反映在表单提交db表中,等等 captcha有一个单独的表格、模型等,即captcha_answer.rb(etc) 迁移中验证码应答的属性为:应答和是否正确

我是Rails的新手,所以如果我的问题有明显的答案,请原谅我

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

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

模型为form_submission.rb

但是,我在联系人表单中有一个字段——captcha——它没有反映在表单提交db表中,等等

captcha有一个单独的表格、模型等,即captcha_answer.rb(etc)

迁移中验证码应答的属性为:应答和是否正确

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

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

这些是什么?它们是动物吗

可选择:猫、狗、树、兔子。。在选择中

我想做的是验证:

a) POST中存在验证码字段(如果没有,则返回消息“未给出验证码”) b) 给出的答案在captcha_answers中有一个值。正确与否(如果不正确,返回消息“you gived a error answer”)

capcha_answers.answer始终是唯一的,因此我希望执行与SQL查询等效的操作,该查询获取第一条记录,其中captcha_answers.answer=并返回captcha_answers.is_的值

就像我说的,如果属性是form_提交的,那么我就可以验证它,没有问题,但是我不知道如何根据另一个模型中的内容验证字段


有什么想法吗?

您只需添加一个隐藏字段,然后在控制器中捕获它:

params[:signup]
以您的形式:

<%= hidden_field(:signup, :pass_confirm, :value => 'abcd') %>
在那里,您可以访问不同的模型并验证答案

控制器中的操作如下:

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

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

params[:signup]
以您的形式:

<%= hidden_field(:signup, :pass_confirm, :value => 'abcd') %>
在那里,您可以访问不同的模型并验证答案

控制器中的操作如下:

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

为额外字段定义访问器并使用常用的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
classmymodeltrue
验证:自定义验证方法
def自定义验证方法
errors.add:extra\u field,:无效,除非extra\u field==“correct”
结束
结束

为额外字段定义访问器并使用常用的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
classmymodeltrue
验证:自定义验证方法
def自定义验证方法
errors.add:extra\u field,:无效,除非extra\u field==“correct”
结束
结束

您是否想过使用一些插件?或者谢谢。在这种情况下,我想用“艰难”的方式来做,因为这部分是一种学习练习。对于未来的项目,我很可能会这么做。你想过使用一些插件吗?或者谢谢。在这种情况下,我想用“艰难”的方式来做,因为这部分是一种学习练习。对于未来的项目,我很可能会这样做。谢谢。我在表单中得到了字段,但问题是在另一端捕获它并进行验证。这是“在那里你可以访问不同的模型并验证答案。”这是我正在努力解决的问题。谢谢。我在表单中得到了字段,但问题是在另一端捕获它并进行验证。这是“在那里你可以访问不同的模型并验证答案。”这是我正在努力解决的问题。谢谢。到目前为止,它让我明白了这一点,但当它被传递到create时,我得到了一个“未定义的方法”-大概是on.captcha。create的基本结构是:def create'@'form_submission=FormSubmission.new(params[:form_submission])#如果@form u submission.Save redirect_指向('/Thank.html'),则保存对象else render('new')end是否知道如何阻止控制器尝试为验证码创建值,如果是这样的话?谢谢。到目前为止,它让我明白了这一点,但当它被传递到create时,我得到了一个“未定义的方法”-大概是on.captcha。create的基本结构是:def create'@'form_submission=FormSubmission.new(params[:form_submission])#如果@form u submission.Save redirect_指向('/Thank.html'),则保存对象else render('new')end是否知道如何阻止控制器尝试为验证码创建值,如果它正在这样做?