Rails フォーム検証 質問する

Rails フォーム検証 質問する

ユーザーが広範なフォームに入力してデータベース クエリを作成できる Rails アプリがあります。Rails でフォーム パラメータをチェックするためのベスト プラクティスを知りたいと思いました。以前は、メソッドresults(フォームが送信されるメソッド) で次の操作を実行していました。

if params[:name] && !params[:name].blank?
  @name = params[:name]
else
  flash[:error] = 'You must give a name'
  redirect_to :action => 'index'
  return
end

しかし、フォーム フィールドが複数ある場合、各フィールドでこれを繰り返すのは面倒です。フィールドの設定が異なるため、各フィールドをチェックするために、すべてのフィールドをループに挿入することはできませんでした。

  • 単一のキー:params[:name]
  • キーとサブキー:params[:image][:font_size]
  • 別のフィールドが設定されている場合のみ、一部のフォームフィールドが入力されることを期待します

など。これもまた、flash[:error]不足している/無効なパラメータごとに設定し、それぞれに対して同じ URL にリダイレクトしていたため、繰り返しになっていました。私は、before_filterすべての必要なフォーム パラメータをチェックし、すべてが正常である場合にのみ true を返す を使用するように切り替えました。その後、my メソッドがresults続行され、変数はチェックなしでそのまま割り当てられます。

@name = params[:name]

私のvalidate_form方法では、次のようなコードセクションがあります。

if (
  params[:analysis_type][:to_s] == 'development' ||
  params[:results_to_generate].include?('graph')
)
  {:graph_type => :to_s, :graph_width => :to_s,
   :theme => :to_s}.each do |key, sub_key|
    unless params[key] && params[key][sub_key]
      flash[:error] = "Cannot leave '#{Inflector.humanize(key)}' blank"
      redirect_to(url)
      return false
    end
  end
end

私は、これを最善の方法で行っているのか、それともパラメータ検証に関して明らかなことを見落としているのか疑問に思っていました。 に値を割り当て、flash[:error]同じ URL にリダイレクトし、false を返すブロックがいくつかあるため、これがまだ最も効率的な手法ではないのではないかと心配しています。

明確にするために編集します:現在、モデルにこの検証がない理由は 2 つあります。

  • データベースの行を作成または更新するためにユーザーからデータを収集しようとしているわけではありません。ユーザーが送信したデータは、ログアウト後には保存されません。送信したデータはすべて、データベースを検索して何かを生成するためにすぐに使用されます。
  • クエリ フォームは、複数のモデルに関連するデータと、モデルにまったく関連しない他のデータを取得します。たとえば、上記のグラフ タイプとテーマはどのモデルにも接続されず、ユーザーが結果をどのように表示したいかに関する情報を伝えるだけです。

改善されたテクニックを示すために編集します:私はJamis Buckのおかげで、アプリケーション固有の例外を利用できるようになりました。適切な例外の発生に関する記事。 例えば:

def results
  if params[:name] && !params[:name].blank?
    @name = params[:name]
  else
    raise MyApp::MissingFieldError
  end

  if params[:age] && !params[:age].blank? && params[:age].numeric?
    @age = params[:age].to_i
  else
    raise MyApp::MissingFieldError
  end
rescue MyApp::MissingFieldError => err
  flash[:error] = "Invalid form submission: #{err.clean_message}"
  redirect_to :action => 'index'
end

ベストアンサー1

active_form (を試してみるといいでしょう)http://github.com/cs/active_form/tree/master/lib/active_form.rb) - データベース関連の部分を除いた ActiveRecord だけです。この方法では、AR のすべての検証機能を使用し、フォームを他のモデルと同じように扱うことができます。

class MyForm < ActiveForm
  validates_presence_of :name
  validates_presence_of :graph_size, :if => # ...blah blah 
end

form = MyForm.new(params[:form])
form.validate
form.errors

おすすめ記事