2012-03-08 9 views
0

私はRailsの相対的な初心者です。私の質問には明らかな答えがある場合は私を許してください。Railsのモデル/コントローラにないフィールドの妥当性確認

私は、モデル/コントローラまたはビューに関連付けられた移行にないフィールドをRailsフォームに含めることを試みています。

フォームは単純な公開連絡フォームであり、ほとんどのフィールドに対して簡単に検証できます。例えば、名前、電子メールなど

モデルはしかし、私はコンタクトフォームのフィールドを持っている

form_submission.rbある - キャプチャ - form_submissionsのdbテーブルに反映されていない、など

captchaのための別のテーブル、モデルなどがあります。これはcaptcha_answer.rb(など)

です。移行でのcaptcha_answerの属性は、answerとis_correctです。

シンプルテーブルには、事前定義された質問への回答のリストが含まれています。いくつかは真であり、いくつかは偽です。

例えば、キャプチャの質問は次のようになります。

これらは動物です

オプション:cat、dog、tree、rabbit ..を選択します。私が行うことができるようにしたいどのような

はそれを検証することです:

キャプチャフィールドが与えられた答えは持っている)されていない場合 b)は、「与えられていないキャプチャ」のPOST(リターン・メッセージに存在するA)

あなたが最初のレコードを取得するSQLクエリと同等の処理をしたいのですが、ここではcapcha_answers.is_correctの値をtrueに設定します(返さない場合は「あなたが間違った答えを返しました」というメッセージ)。

captcha_answers.answer =とcaptcha_answers.is_correctの値を返します

私が言うように、 ttributeはform_submissionsにありましたが、私はそれを問題なく検証することができましたが、別のモデルで何かに対してフィールドを検証する方法を理解できません。

アイデア?

+0

思いましたか? https://www.ruby-toolbox.com/categories/rails_captchaまたはhttps://github.com/ambethia/recaptcha – Roger

+0

ありがとうございます。この場合、私はそれを部分的に学習の練習なので、「難しい」方法でやりたいと思っています。将来のプロジェクトのために、私はそれでもうまくいくかもしれません。 – richquick

答えて

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]) 位 redirect_to( '/ thanks.html')他 form_submission.save @場合は、オブジェクト を保存します( '新しい') 終了 エンド 任意のアイデアどのように私をレンダリングそれが何をしているのかコントローラがcaptchaの値を作成しようとするのを止めることができますか? – richquick

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

関連する問題