0

私は現在フォームを持っています(form_tagを使用)。フィールドの1つは、オプションのドロップダウンリストです。各オプション値は、コントローラーのメソッドの名前と一致します。フォーム送信ボタンをクリックすると、ドロップダウンフィールドで選択した値に直接対応するコントローラーメソッドが実行されます。

現在、回避策を作成しましたが、冗長すぎると感じています。

def run_reports
  case params[:report_name]
    when 'method_1' then method_1
    when 'method_2' then method_2
    when 'method_3' then method_3
    when 'method_4' then method_4
    else method_1
end
# each method matches a method already defined in the controller 
# (i.e. method_1  is an existing method)

ドロップダウンオプション値を使用して、form_tagアクション(つまり、:action => params [:report_name])を介してコントローラーで対応するメソッドを実行することは機能する可能性があると思っていましたが、フォーム内のアクションのため、これは機能しません。 params値を設定する前に設定する必要があります。この機能にJavaScriptを使用したくありません。

これが私のフォームです:

<%= form_tag("../reports/run_reports", :method => "get") do %>
  <%= select_tag :report_name, options_for_select([['--  Please Select  --',nil],['Option 1','method_1'], ['Option 2','method_2'], ['Option 3','method_3'], ['Option 4','method_4']]) %>
  <%= submit_tag "Run Report" %>
<% end %>

助言がありますか?

コントローラメソッドを次のように変更できますが、実際にコントローラメソッドを呼び出して実行することはできますか?params値が文字列として返されるため、これは実行されないと思います...

def run_reports
  params[:report_name]
end
4

2 に答える 2

1

警告: これはひどい考えです

コントローラーで次のようなコード スニペットを介してメソッドを呼び出すことができます。

send(params[:report_name].to_sym)

これがひどい考えである理由は、ページにアクセスする誰もが、危険なものを呼び出す要求を挿入することによって、任意のメソッドを呼び出す要求を手動で作成できるからです。あなたは本当に、本当にこれをしたくありません。既知の信頼できるメソッドをフォームで動的に呼び出すように何かを設定することをお勧めします。

于 2013-02-01T01:16:36.240 に答える
0

アプリケーションの設計を再考する必要があると思います (私が知っていることはほとんどありません)。レポートの実行を担当するコントローラーがありますが、実際にはそうすべきではありません。コントローラーは、Web サーバーとアプリの残りの部分との間の接続を管理します。

解決策の 1 つは、ReportGenerator という新しいクラスを作成して、レポートを実行し、結果をコントローラーに返すことです。コントローラーは、単一のアクション (たとえば、show) で可能なレポートを実行します。変数ビューが必要な場合は、さまざまな種類のレポートに対応するパーシャルを使用できます。

ReportGenerator に関しては、少し工夫が必要です。個々のクラスを使用して各レポート タイプを生成することが最善の解決策である可能性は十分にあります。

于 2013-02-01T01:16:53.327 に答える