2

ransack を使用して製品のリストをフィルタリングしています。現在の選択を再利用して、代わりに Excel ファイルを返すようにしたい (そのため、同じページに「フィルター処理された製品を Excel としてダウンロードする」リンクを配置することができます)、またはフィルター処理された結果に対して削除を実行します。たとえば、呼び出された URL は次のようになります。

http://localhost:3000/products?utf8=%E2%9C%93&q%5Bstatusowner_id_or_client_producer_id_eq%5D=&q%5Bkind_eq%5D=&q%5Bstatus_eq%5D=9&commit=Select

Excel を返す最も簡単な方法は、同じパラメーターを渡すことです。製品の最後に .xls のみを追加して同じ URL を渡すことです。

http://localhost:3000/products.xls?utf8=%E2%9C%93&q%5Bstatusowner_id_or_client_producer_id_eq%5D=&q%5Bkind_eq%5D=&q%5Bstatus_eq%5D=9&commit=Select

ビューで現在の URL を再利用して新しい URL を作成するにはどうすればよいですか?

次に、一括削除について: これまで RESTful ルートしか使用していないため、それを処理する方法がわかりません。上記のアイデアに従って、URL を再利用し、(まだ定義されていません??) 一括削除アクションに送信するとします。可能な限りRESTfulにルーティングするにはどうすればよいですか? メソッドを追加するだけです: :delete? そして、コントローラーのどこにそれをルーティングしますか?

少し途方に暮れています。

4

1 に答える 1

3

URLではなく、ランサック検索フォームとパラメータを再利用するのがポイントだと思います。

インデックス アクションを使用して削除を実行したり、Excel をレンダリングしたりするだけの場合は、route.rb を変更しないでおくことができます。

ビューでは、ランサックフォームがあると思います

<%= search_form_for @products do |f| %>
   # YOUR CONDITIONS
   <%= f.submit 'query' %>  #Just query

   # add two new buttons.
   <button id="output_xls" name="output_xls">Output</button>
   <button id="mass_delete" name="mass_delete">Delete</button>
<% end %>

2 つのボタンで JavaScript を使用できます。ボタンがクリックされると、JS は対応するパラメーターをフォームに追加して送信します。

$('#output_xls').click(function(){
  $('form').append('<input type="hidden" name="format" value="xls" />');
  $('form').get(0).submit();
});

$('#mass_delete').click(function(){
  $('form').append('<input type="hidden" name="method" value="delete" />');
  $('form').get(0).submit();
});

コントローラーでは、パラメーターに応じてロジックを決定できます。

def index

  #EXECUTE RANSACK SEARCH

  if params.delete(:method) == 'delete'
    #DELETE RECORDS
  end

  respond_to do |format|
    format.html {# DO YOUR REDIRECTING }
    format.xls {# OUTPUT YOUR EXCEL }
  end 
end

config/initializers/mime_types.rb に MIME タイプを登録することを忘れないでください。

Mime::Type.register "application/vnd.ms-excel", :xls

私はたくさん書きました、質問があれば、以下にコメントしてください:)

于 2013-08-24T08:26:38.413 に答える