2012-03-08 33 views
0

我是Rails的相對新手,所以如果我的問題得到了明顯的答案,請原諒我。驗證Rails中不在模型/控制器中的字段

我試圖在Rails窗體中包含一個不在模型/控制器或與視圖相關的遷移中的字段。

該表格是一個簡單的公共聯繫表格,我可以很容易地驗證大多數字段。例如姓名,電子郵件等

該模型是form_submission.rb

不過,我在聯繫表格字段 - 驗證碼 - 這是不是在form_submissions db表鏡像等

有一個單獨的表格,模型等captcha_answer.rb(等)captcha_answer.rb(等)

captcha_answer遷移的屬性是:answer和is_correct。

表簡單包含一個預定義問題的答案列表,其中一些是真實的,一些是錯誤的。

例如,驗證碼的問題可能是:

這是這是一種動物?

可選擇:貓,狗,樹,兔子..在選擇。

我希望能夠做的是驗證:

一)驗證碼字段中的「無驗證碼給出」如果不) B中的POST(返回消息存在)給出的答案有一個captcha_answers.is_correct中的值爲true(返回「你給出了錯誤答案」的消息,如果沒有的話)

capcha_answers.answer總是唯一的,所以我想做一個SQL查詢的等價物,它獲取第一個記錄captcha_answers.answer =並返回captcha_answers.is_correct的值

就像我說的,如果a ttribute在form_submissions中,那麼我可以驗證它沒有問題,但我無法弄清楚如何在另一個模型中驗證某個字段與某個字段的對應關係。

任何想法?

+0

怎麼想使用一些插件像控制器

行動? https://www.ruby-toolbox.com/categories/rails_captcha或https://github.com/ambethia/recaptcha – Roger 2012-03-08 12:37:54

+0

謝謝。在這種情況下,我想以「硬」的方式來做,因爲這部分是學習練習。對於未來的項目,我可能會這樣做。 – richquick 2012-03-08 12:50:19

回答

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 
+0

謝謝你。它讓我如此遙遠,但當它傳遞到創建時,我得到一個「未定義的方法」 - 大概在.captcha 創建的基本結構是: def create '@'form_submission = FormSubmission.new(PARAMS [:form_submission]) #保存對象 如果@ form_submission.save redirect_to的( '/ thanks.html') 其他 渲染( '新') 結束 結束 任何想法如何我可以阻止控制器嘗試爲驗證碼創建值,如果這就是它的作用? – richquick 2012-03-08 16:15:46

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 
+0

謝謝。我已經在形式領域,但問題是在另一端捕捉它並驗證。 例如,「您可以訪問不同的模型並驗證答案。」我正在努力。 – richquick 2012-03-08 12:54:59

相關問題