为什么Rails使用:action => methodname作为ID => methodname处理link_to

时间:2012-02-17 00:26:48

标签: ruby-on-rails ruby

我正在尝试在Rails(2.1)中建立一个链接:

  1. 仅对管理员用户显示
  2. 单击时,在控制器中执行方法
  3. 该方法执行一个小的shell脚本(例如,输出文本文件的短sql查询),
  4. 提示用户下载输出文本文件
  5. 一切都在同一页面上完成,无需重定向到另一页(理想情况下)
  6. 我尝试使用这些解决方案从Ruby运行shell脚本:(1),(2)。在我的reports_controller.rb

      def runreport    
        #system('sh hello.sh')
        puts `whoami` # << this is just to test shell script calling
      end
    

    在我的view/report/index.html.erb

    <% if is_logged_in? && logged_in_user.has_role?('Administrator') -%>
      <p><span class="encapsulated"><%= link_to "Download File", { :action => 'runreport' } %></span></p>
    <% end -%>
    

    <span class="encapsulated">只是将链接放在一个漂亮的按钮形式中)。但是,当我单击该链接时,它会返回错误:

    ActiveRecord::RecordNotFound in ReportsController#show 
    Couldn't find Report with ID=runreport
    ...
    app/controllers/reports_controller.rb:100:in `show'
    

    使用参数:

    {"id"=>"runreport"}
    

    当链接指向自身(reports)时,执行的默认方法是“show”。但是没有特别告诉他做action => 'runreport'吗?我已经摸不着头脑,寻找几个小时的答案,但无法理解:(因此,我的问题是:

    1. 我做错了什么?
    2. 为什么要找id =&gt;“runreport”?
    3. 如何修复错误?如果可以告诉它不做重定向
    4. 在脚本完成后,将文件传递给用户的理想方法是什么?
    5. 提前感谢您的任何帮助/反馈!

      干杯!

      编辑:这就是报告中routes.rb的样子:

      map.resources :reports, 
      :member => { :claim => :put, :close => :put, :open => :put, :baz => :post }, 
      :collection => {:search => :get} do |report|
          report.resources :blah, :foo => { :bar => :post }
        end
      

      这是在Rails 2.1上,所以我认为它与3.x

      不同

2 个答案:

答案 0 :(得分:1)

一般来说,问题在于路线。

如果您在

中定义了其他路线
map.resources :reports

或在轨道3及以上

的情况下
resources :reports 

假设/reports/:id是展示动作。因此,当您转到“/ reports / runreport”时,它会转到show动作并尝试使用Id“runreport”查找Report对象。

阅读此http://guides.rubyonrails.org/routing.html#resources-on-the-web

您可能希望在报告中定义收集路由以使其正常工作。阅读此http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

答案 1 :(得分:0)

我还没弄清楚为什么控制器总是默认使用show方法,但我找到了一种解决方法。我只是在调用runreport方法之前点击链接(将重新加载同一页面)时调用我的show方法。

我猜,因为页面总是调用show方法,这是一种“成员”方法,所以它总是会寻找一些id。

感谢您的帮助!