Почему Rails обрабатывает link_to с помощью: action => methodname as ID => methodname - PullRequest
1 голос
/ 17 февраля 2012

Я пытаюсь создать в Rails (2.1) ссылку, которая:

  1. Отображается только для пользователей с правами администратора
  2. При нажатии запускает метод в контроллере,
  3. Метод выполняет небольшой сценарий оболочки (например, короткий SQL-запрос, который выводит текстовый файл),
  4. Предлагает пользователю загрузить выходной текстовый файл,
  5. Все сделано нату же страницу без перенаправления на другую страницу (в идеале)

Я пробовал эти решения для запуска сценария оболочки из 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'?Я почесал голову и несколько часов искал ответы и не мог понять :( Итак, мои вопросы:

  1. Что я делаю не так?
  2. Почему он ищет id => "runreport"?
  3. Как исправить ошибку? И если можно сказать, чтобы она не выполняла перенаправление
  4. И каков идеальный способ доставкифайл для пользователя после завершения сценария?

Заранее благодарен за любую помощь / обратную связь!

Приветствия!

РЕДАКТИРОВАТЬ: Вот как 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

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Обычно проблема связана с маршрутами.

Если вы определяете маршруты отдыха, как в

map.resources :reports

или в случае рельсов 3 и выше

resources :reports 

Предполагается, что /reports/:id - это действие шоу. Поэтому, когда вы переходите в «/ reports / runreport», он переходит к действию show и пытается найти объект Report с идентификатором «runreport».

Читать это http://guides.rubyonrails.org/routing.html#resources-on-the-web

Возможно, вы захотите определить маршрут сбора в отчетах, чтобы сделать эту работу. Прочитайте это http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

0 голосов
/ 18 февраля 2012

Я не совсем понял, почему контроллер всегда по умолчанию использует метод show, но я нашел обходной путь. Я просто заставляю его вызывать мой метод runreport при нажатии на ссылку (которая перезагрузит ту же страницу), прежде чем он вызовет метод show.

Я предполагаю, поскольку страница всегда вызывает метод show, который является методом "member", он всегда будет искать какой-то идентификатор.

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...