2012-02-17 14 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。

感謝您的幫助!

相關問題