11

コントローラー アクションに固有の情報 (チェックボックス) を含む form_tag パネルを作成しています。このアクションは、「routes.rb」で次のように設定されます。

resources :students do
  collection do
    get :send_student_report_pdf
  end   
end

このセットアップは、link_to からアクションを呼び出すと完全に機能します。

<%= link_to "Download PDF Report", :action => 'send_student_report_pdf', :controller => 'students'%>

ただし、で使用すると、次のform_tagエラーが発生し続けます。

Routing Error
No route matches "/students/send_student_report_pdf"

form_tag私が持っているコードはここにあります:

<%= form_tag :controller => 'students', :action => 'send_student_report_pdf', :method => 'get' do %>
  <%= label_tag "Include columns" %> <br>
  <%= check_box_tag "first_name", params[:first_name], checked = true %> <%= label_tag "First Name" %><br>  
  <%= submit_tag "Download PDF Report", :action => 'send_student_report_pdf', :controller => 'students'%>  
<% end %>

私はそれにURL、パスを与えようとしました:

<%= form_tag send_student_report_pdf_students_path, :method => 'get' do %>

しかし、それは一貫して同じRouteエラーを私に与えてきました(アクションがroutes.rbにまったく存在しないかのように、link_to代わりに使用して完全に機能します)form_tag submit

コントローラーのアクションのコードは次のとおりです。基本的にはファイルを送り返します。

def send_student_report_pdf
  @students = search_sort_and_paginate
  puts "params[:first_name] = ", params[:first_namea]
  send_data(generate_pdf_report(@students), :filename => "report.pdf", :type => 'application/pdf') 
end

ここで何かが足りないことに気付いたら、助けてください。

どうもありがとうございました、

よろしく、

4

1 に答える 1

24

form_forの:method => 'get'部分は options ハッシュではなく url_for_options ハッシュにあるため、Rails は代わりに cgi params として URL に配置します。これを次のように変更してみてください。

form_tag url_for(:controller => 'students', :action => 'send_student_report_pdf'), :method => 'get' do ...

名前付きルートを使用できない理由は、ルートで名前を付けていないためです。ルートで名前を付け、form_tag で名前付きルートを使用する場合、url_for を使用する必要はありません...

resources :students do
  collection do
    get :send_student_report_pdf, :as => :send_student_report_pdf
  end   
end

実行して、ルートが期待どおりかどうかを確認できますrake routes

于 2011-03-06T18:58:53.873 に答える