我是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中,那么我就可以验证它没有问题,但我无法弄清楚如何在另一个模型中对某些内容进行验证。
有什么想法吗?
答案 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