2015-06-04 2 views
0

Я пытаюсь связать действие с моим контроллером с точки зрения. Когда я рейка маршрутов, я вижуRails link_to существующий маршрут

document_version_file_index GET /document_versions/:document_version_id/file(.:format)   file#index 

Я думаю, что это маршрут, который я хочу ударить. Мой контроллер называется document_versions_controller, и он включает действие, называемое загрузкой, которое я хочу вызвать. Когда я пытаюсь

<%= link_to linkText, :document_version_file %> 

Я получаю ошибку маршрутизации:

No route matches {:action=>"show", :controller=>"files"} 

Там нет контроллера файлов. Я пытаюсь нажать на контроллер document_version. Что я делаю не так?

EDIT: Как я строю свой маршрут:

resources :document_versions do 
    resources :files 
    member do 
     get 'download', :action => :download 
     resources :document_version 
    end 
    end 

EDIT 2: Можем ли мы сделать шаг назад и делать вид, у меня нет пути в существовании уже? У меня есть представление и контроллер. Контроллер имеет def download, имеет имя document_versions_controller.rb и имеет class DocumentVersionsController < ApplicationController. Как я могу сделать маршрут, который ударяет по этому методу загрузки, и вызвать его ссылкой со ссылкой на мой взгляд?

ответ

1

Моя проблема заключалась в том, что я был приравнивая две цели: построение маршрута ударить моего контроллера действий, и строить мой апи вызова URL. Атрибут api (который включает в себя file и version_id) строится в действии контроллера, и неправильно пытаться построить маршрут для соответствия api url. Я изменил мой routes.rb, так что теперь он выглядит следующим образом:

resources :document_versions do 
    member do 
     get 'download', :action => :download 
    end 
    end 

и мой link_to в представлении выглядит следующим образом:

<%= link_to linkText, download_api_document_versions_path(:version_id => version.document_version[:id]) %> 

и мой контроллер выполняет апи вызов с Фарадеем в действии скачать ,

+1

Рад, что вы нашли здесь проблему! – tadman

3

Этот маршрут требует аргумента :document_version_id, поэтому вы не можете его так прямо назвать. Способ использовать этот маршрут будет:

document_version_file_index_path(@document_version_file) 

Я не знаю, почему маршрут имеет index во имя, как правило, автоматически сгенерированные маршруты не делают.

Простой способ запомнить, как работают эти маршруты, для каждого аргумента типа :x в пути, который не является необязательным, а не внутри скобок, вы указываете значение для этого в том порядке, в котором они появляются.

Маршрут до /:a/:b.(:c) можно назвать x(a,b) или x(a,b,c), в любом случае действителен, так как :c не является обязательным.

+0

Извините, но я не думаю, что это не сгенерировано автоматически. Я добавил это routes.rb: 'ресурсы: document_versions сделать ресурсов: файлы сбора сделать получить 'скачать': действие =>: скачать ресурсов: document_version конца конца' –

+0

В этом ответе, @document_version_file должен быть Значение: document_version_id? Когда я пытаюсь сделать это, я получаю «синтаксическую ошибку, неожиданную» (« –

+1

» Используйте 'member do' (это экземпляр) вместо' collection do' (это класс), а затем используйте то, что использует «рейк-маршруты» out – rkamun1

0

Просто используйте

<%= link_to linkText, :document_version_file_index_path(@document_version_file) %> 

Где @document_version_file является версия документа, который вы хотите увидеть все файлы.

Отредактировано: Это приведет к путям как за исключения.

get 'document_versions/:document_version_id/files' => 'document_versions#index', as: : document_version_files