【问题标题】:problems with form_tag for controller action with members-get route使用成员获取路由的控制器操作的 form_tag 问题
【发布时间】:2011-07-09 21:43:57
【问题描述】:

我正在制作一个 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

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

非常感谢,

问候,

【问题讨论】:

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


    【解决方案1】:

    form_for 中的:method =&gt; 'get' 部分位于 url_for_options 散列中,而不是选项散列中,因此 Rails 会将其作为 cgi 参数放在 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来检查您的路线是否如您所愿

    【讨论】:

    • 哇,这太棒了!非常感谢你的帮助。我有一个关于与控制器共享“form_tag”参数(例如 check_box_tag 开/关、text_field_tag 值)的小问题。我试过:。但是在控制器中,当我尝试获取“params [:first_name] 的值时,我没有得到任何回报。非常感谢,不过,您的原始答案真的帮助了我!
    • 查看您的开发日志。它会告诉您哪些参数已发送到操作,这将帮助您了解需要如何引用它。
    • 酷。我通过将 :value => params[:first_name] 添加到 check_box_tag 来解决这个问题。现在 params[:first_name] 出现在控制器动作中。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多