2012-02-17 7 views
1

私はRailsの内のリンク(2.1)ことを確認しようとしています:なぜRailsのプロセスのlink_toと:アクション=> methodNameのようにID => methodNameの

  1. のみ表示され、管理者ユーザーのための
  2. がクリックされました、すべてがオンに行われ
  3. 、出力テキストファイルをダウンロードするようにユーザーに促します
  4. 、この方法は、小さなシェルスクリプト(テキストファイルを出力し例えば短いSQLクエリ)を実行
  5. 、コントローラにメソッドを実行しますリダイレクトせずに同じページ(1)、(2):別のページ(理想的には)

に私は、Rubyからシェルスクリプトを実行するために、これらのソリューションを試してみました。私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. を行うと、どのようなスクリプトが実行された後、ユーザーにファイルを提供するための理想的な方法だ?
  5. ないし、それを伝えることが可能です場合

ご協力いただきありがとうございます!

乾杯!

EDIT:これは、レポートの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の

+0

routes.rbのレポートコントローラのルートをどのように定義しましたか? –

+0

上記のレポートコントローラのルートを追加したばかりです – mathiass

答えて

1

異なるだと仮定します。

あなたは

map.resources :reports

または3と

resources :reports
上記

そのは/reports/:idは、showアクションであることを前提とレールの場合のように安らかなルートを定義する場合。したがって、 "/ 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

runreportを ':collection'に追加しても、' {ID => runreport} 'を探します。 'map.runreport 'reports/runreport'、:controller => 'reports'、:action => 'runreport''私は変更を加えるたびにサーバスクリプトを再起動しました。 – mathiass

+0

リンクありがとう! – mathiass

0

コントローラが常にデフォルトのshowメソッドを使用している理由がわかりませんでしたが、回避策が見つかりました。 showメソッドを呼び出す前に、リンクをクリックすると(同じページをリロードする)私のrunreportメソッドを呼び出します。

私が推測しているのは、ページが常に「メンバ」メソッドであるshowメソッドを呼び出しているため、常にいくつかのIDが検索されるためです。

ありがとうございました!

関連する問題