0

ruby は初めてですが、ビュー (index.html.erb) 内から SH スクリプトを実行しようとしているときに、次の問題に遭遇しました。私は次のことをしました:

app\views\tests\index.html.erb

<%= link_to 'Run it', :action=>'callthis' %>

app\controllers\tests_controller.rb

def callthis
  puts "I was called!"
      # system call here
end

次のエラーが表示されます

ActionController::RoutingError (No route matches {:action=>"callthis", controller=>"tests"}):
app/views/tests/index.html.erb:20:in `_app_views_tests_index_html_erb__911976670__617626598'
app/views/tests/index.html.erb:4:in `each'
app/views/tests/index.html.erb:4:in `_app_views_tests_index_html_erb__911976670__617626598'
app/controllers/tests_controller.rb:7:in `index'

編集:ルート

tests     GET    /tests(.:format)                             tests#index
          POST   /tests(.:format)                             tests#create
new_test  GET    /tests/new(.:format)                         tests#new
edit_test GET    /tests/:id/edit(.:format)                    tests#edit
test      GET    /tests/:id(.:format)                         tests#show
          PUT    /tests/:id(.:format)                         tests#update
      DELETE /tests/:id(.:format)                         tests#destroy

編集 2:Zippy に感謝します。hello が出力されていることがわかりますが、次のエラーも表示されます。

Hello
Started GET "/tests/callthis" for 10.10.9.141 at Wed Mar 13 16:29:22 -0400 2013
Processing by TestsController#callthis as HTML
Completed 500 Internal Server Error in 6ms

ActionView::MissingTemplate (Missing template tests/callthis, application/callthis with     {:handlers=>[:erb, :builde
:formats=>[:html], :locale=>[:en]}. Searched in:
  * "/mnt/wt/ruby/wtrorp/app/views"
):

編集3:

「tests」ビューからは、「testscontroller」で定義された「callthis」を実行することだけを考えています。その def は、SH スクリプトを実行するためのシステム コールにすぎず、生成された出力ファイルをファイル システムにリダイレクトします。文字列(テストオブジェクト「test.script」にあります)とID(ブラウザセッションから取得したい)の2つの引数を渡すことを検討しています。問題が非常に難しくなったことに気づき、それを反映するようにヘッダーの質問を更新します:D

system(./callthis.sh test.script $my_id_var)

編集4:

shスクリプトからファイルを生成し、静的にリダイレクトしようとしています。静的ページは変数をキャッチし、sh スクリプトが生成したファイルを認識して、その静的ページのフレームに表示できるようにします。この質問の文脈から外れているかもしれませんが、誰かが私を正しい方向に向けることができますか?

お時間をいただきありがとうございます。

4

2 に答える 2

1

テンプレートが見つからないというエラーを解決するには、テンプレートをレンダリングするか、有効な URL にリダイレクトするか、少なくとも「render :nothing」や「head :ok」などを呼び出して、レールにユーザーのブラウザへの応答方法を指示する必要があります。 .

セッションから抜けていると言うIDを含め、ユーザー入力のサニタイズには細心の注意を払ってください。ユーザーがそれを悪意を持って変更して何か悪いことをする方法を見つけた可能性があると仮定し、それをホワイトリスト (おそらく数字のみまたはそのようなもの) と照合します。このようなシェル スクリプトを実行することは、非常に偏執的で慎重でない限り、本質的に安全ではありません。そして、アプリを維持している他のすべての人も同様です。

于 2013-03-13T20:57:35.567 に答える
0

手始めにこれを追加してみてください:

config/routs.rb

resources :tests do
  collection do
    get 'callthis'
  end
end

または、このような複数のルートがない場合は、次のことができます: (同じこと)

resources :tests do
  get 'callthis', :on => :collection
end

また、ヒント: アクションに のような名前を付けないでくださいcallthis。そのアクションが何をしようとしているのか、ここでは誰も知りません。私が助けてくれることを願っています。

編集:質問者がルートを更新した後、質問をさらに読んだ後、1​​つだけコメントすることをお勧めします:

callthisコントローラーを次のように宣言します。

def callthis
   #perform your sh script
   redirect to tests_path
end
于 2013-03-13T20:28:09.503 に答える