使用members-get路由的控制器操作的form_tag问题

时间:2011-03-06 18:17:57

标签: ruby-on-rails routes form-for link-to

我正在创建一个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 %>

我试过给它一个网址,路径如下:

<%= 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

如果你发现我在这里遗漏了什么,请帮助我。

非常感谢,

问候,

1 个答案:

答案 0 :(得分:24)

form_for中的:method => 'get'部分位于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

来检查您的路线是否符合您的预期