проблемы с form_tag для действия контроллера с members-get route - PullRequest
11 голосов
/ 06 марта 2011

Я делаю панель form_tag, которая содержит информацию (флажки), относящуюся к действию контроллера. Это действие настраивается в "rout.rb" следующим образом:

resources :students do
  collection do
    get :send_student_report_pdf
  end   
end

Эта настройка отлично работает , когда я вызываю действие по ссылке:

<%= 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 (как если бы действие не существовало вообще в route.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 Ответ

24 голосов
/ 06 марта 2011

Часть :method => 'get' в вашем form_for содержится в хэше url_for_options, а не в хэше параметров, поэтому Rails вместо этого поместит его в URL в качестве параметров cgi. Попробуйте изменить это на это:

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

...