Я пытаюсь создать в Rails (2.1) ссылку, которая:
- Отображается только для пользователей с правами администратора
- При нажатии запускает метод в контроллере,
- Метод выполняет небольшой сценарий оболочки (например, короткий SQL-запрос, который выводит текстовый файл),
- Предлагает пользователю загрузить выходной текстовый файл,
- Все сделано нату же страницу без перенаправления на другую страницу (в идеале)
Я пробовал эти решения для запуска сценария оболочки из Ruby: ( 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'
?Я почесал голову и несколько часов искал ответы и не мог понять :( Итак, мои вопросы:
- Что я делаю не так?
- Почему он ищет id => "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