我正在尝试在Rails(2.1)中建立一个链接:
我尝试使用这些解决方案从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'
吗?我已经摸不着头脑,寻找几个小时的答案,但无法理解:(因此,我的问题是:
提前感谢您的任何帮助/反馈!
干杯!
编辑:这就是报告中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 :(得分: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
答案 1 :(得分:0)
我还没弄清楚为什么控制器总是默认使用show
方法,但我找到了一种解决方法。我只是在调用runreport
方法之前点击链接(将重新加载同一页面)时调用我的show
方法。
我猜,因为页面总是调用show
方法,这是一种“成员”方法,所以它总是会寻找一些id。
感谢您的帮助!