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:

从“测试”的角度来看,我只想执行“测试控制器”中定义的“callthis”。该 def 将只是一个执行 SH 脚本的系统调用,并重定向到它生成的输出文件到文件系统。我希望将两个参数传递给它:一个字符串(在测试对象'test.script'中)和一个id(我想从浏览器会话中提取)。我意识到问题变得更加困难,并将更新标题问题以反映它:D

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

编辑4:

我希望从 sh 脚本生成一个文件,并重定向到一个静态文件。静态页面将捕获一个变量,并知道 sh 脚本生成的文件是哪个文件,以便它可以将其显示在该静态页面的框架中。也许脱离了这个问题的背景,但有人能指出我正确的方向吗?

提前感谢您的宝贵时间!

4

2 回答 2

1

要解决 Missing Template 错误,您需要渲染一个模板,重定向到一个有效的 url,或者至少调用类似 'render :nothing' 或 'head :ok' 之类的东西,以便告诉 rails 如何响应用户的浏览器.

清理任何用户输入时要非常小心,包括您说要退出会话的 id。假设用户可能已经想出了如何恶意修改它来做坏事,并根据白名单检查它,可能只有数字或类似的东西。运行这样的 shell 脚本是绝对不安全的,除非你非常偏执和小心。维护该应用程序的其他所有人也是如此。

于 2013-03-13T20:57:35.567 回答
0

尝试为初学者添加这个:

配置/路由.rb

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

或者如果您没有这样的多条路线,您可以这样做:(同样的事情)

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

另外,只是一个提示:不要将您的操作命名为callthis. 这里没有人知道该操作要做什么,当一段时间过去时您也不会知道。希望我有所帮助。

编辑:在提问者更新路线之后,在我进一步阅读问题之后,我只推荐一件事:

像这样声明你的callthis控制器:

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