ユーザーが広範なフォームに入力してデータベース クエリを作成できる 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