Еще один вопрос "нет маршрутов" - PullRequest
1 голос
/ 19 сентября 2011

Человек, вопросов много, но пока я не нашел своей конкретной проблемы.

У меня есть этот пользовательский маршрут, показывающий, когда я запускаю рейковые маршруты (это не то, как я планирую иметь его в долгосрочной перспективе просто для проверки маршрутизации).

# routes.rb
match 'books/:id/file/:name' => 'home#download', :as => :download_book, :via => :get

# rake routes
download_book GET    /book/:id/file/:name(.:format)              {:controller=>"books", :action=>"download"}

В представлении у меня есть

= link_to name, download_book_path(@book.id, name: name)

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

Итак, вопрос на миллион долларов, что происходит с этой ошибкой?

ActionView::Template::Error (No route matches {:controller=>"home", :action=>"download", :name=>"test.zip", :id=>"fcd5c87aef84874eec8f08cc313da85c"}):
    14: %p
    15:   %b Published:
    16:   - @book.attachments.keys.each do |name|
    17:     = link_to name, download_book_path(@book.id, name: name)

1 Ответ

3 голосов
/ 19 сентября 2011

Проблема заключается в точке в вашей переменной name, которая не работает "из коробки" в маршрутах, поскольку она конфликтует со стандартным разделом (.:format) маршрута, как вы видите в своем вызове rake routes.

Решение можно найти в Руководстве по прокладке рельсов. Цитировать:

По умолчанию динамические сегменты не принимают точки - это потому, что точка используется в качестве разделителя для форматированных маршрутов. Если вам нужно использовать точку в динамическом сегменте, добавьте ограничение, которое переопределяет это - например: id => / [^ /] + / разрешает все, кроме косой черты.

Так что если вы делаете так, как они говорят здесь, и изменяете ограничение, чтобы разрешить точки, это должно работать:

match ..., :constraints => { :name => /[^\/]+/ }

Примечание: в вашем примере вы передаете name в хеш, который будет интерпретироваться как переменные строки запроса.

# Rather it should simply be
= link_to name, download_book_path(@book.id, name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...