2012-02-17 85 views
1

我试图在铁轨(2.1)的链接:admin用户的为什么Rails的过程的link_to有:动作=>方法名作为ID =>方法名

  1. 只出现
  2. 点击时,执行在控制器的方法,
  3. 的方法执行一个小外壳脚本(例如,短的SQL查询,其输出的文本文件),
  4. 提示用户下载该输出文本文件,
  5. 一切上完成没有重定向的同一页面到另一页(理想)

我想这些解决方案运行在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 =>“runreport”?
  3. 如何修正这个错误?如果有可能,告诉它不能做重定向
  4. ,什么是剧本完成后交付文件给用户的理想方式?

预先感谢您的任何帮助/反馈!

干杯!

编辑:这是报告的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 

这是on Rails的2.1,所以我想这是从3.x的

+0

你是如何为routes.rb中的报表控制器定义路由的? – 2012-02-17 01:35:49

+0

我刚刚为 – mathiass 2012-02-17 23:16:38

回答

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

+0

以上的报告控制器添加了路由即使我在':collection'中添加了runreport,它仍然在寻找'{ID => runreport}'。当我添加同样的事情:'map.runreport'reports/runreport',:controller =>'reports',:action =>'runreport''我每次进行更改后都重新启动服务器脚本。 – mathiass 2012-02-18 00:04:04

+0

谢谢你的链接! – mathiass 2012-02-18 00:28:35

0

我还没有完全弄清楚为什么控制器始终默认为show方法,但我找到了一种解决方法。我只是在点击链接(它将重新载入同一页面)之前调用我的runreport方法,然后调用show方法。

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

感谢您的帮助!

相关问题