Определение значений по умолчанию в обычных маршрутах - PullRequest
0 голосов
/ 15 февраля 2010

Я добавляю эту строку в мой файл rout.rb

map.connect ':controller/:action/:id/:title', :controller => "recipes"

думает, что я добавляю заголовок рецепта в конце URL, и это будет относиться только к контроллеру рецептов. Я также объявил ресурс в начале файла, как этот

map.resources :recipes

Следующий URL отлично работает

http://localhost:3000/recipes/show/84/testing201
http://localhost:3000/recipes/edit/84/testing2010

Однако, когда я говорю о рейк-маршрутах, я получаю следующее для контроллера рецептов

recipes GET    /recipes(.:format)                 {:controller=>"recipes", :action=>"index"}
             POST   /recipes(.:format)                 {:controller=>"recipes", :action=>"create"}
  new_recipe GET    /recipes/new(.:format)             {:controller=>"recipes", :action=>"new"}
 edit_recipe GET    /recipes/:id/edit(.:format)        {:controller=>"recipes", :action=>"edit"}
      recipe GET    /recipes/:id(.:format)             {:controller=>"recipes", :action=>"show"}
             PUT    /recipes/:id(.:format)             {:controller=>"recipes", :action=>"update"}
             DELETE /recipes/:id(.:format)             {:controller=>"recipes", :action=>"destroy"}

и внизу вижу это

/:controller/:action/:id/:title    
/:controller/:action/:id           
/:controller/:action/:id(.:format) 

Из выходных данных кажется, что заголовок не применяется к маршруту рецепта, но применяется на глобальном уровне. Как это можно исправить, чтобы подстановочный знак (": title" в "/: controller /: action /: id /: title") был применим только к рецептам?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010

Я бы прокомментировал map.resources, прокомментировал соединение и сделал бы это еще раз с map.with_options:

map.with_options :controller => 'recipes' do |recipes|
 recipes.list '', :action => 'index'
 recipes.delete '/delete/:id/:title', :action => 'delete'
 recipes.edit '/edit/:id/:title', :action => 'edit'
end
0 голосов
/ 15 февраля 2010

Вы смешиваете две разные концепции маршрутизации. Один из них - маршруты RESTful (читайте об этом в Google), а другой - общий / общий маршрут. Вы должны использовать только один из них. Рекомендуется RESTful (map.resources :recipes). Но сначала вам нужно решить, какой из них использовать.

Плюс это определение неверно:

map.connect ':controller/:action/:id/:title', :controller => "recipes"

У вас есть: контроллер переменной в маршрутах, а затем вы говорите, что: контроллер должен быть привязан к «рецептам». Один из способов исправить это:

map.connect '/recipes/:action/:id', :controller => "recipes"

или лучше

map.connect '/recipes/:id/:action', :controller => "recipes"

и вы приближаетесь к RESTful-маршрутам.

Если вы хотите использовать заголовок в своих маршрутах, используйте именованный маршрут в сочетании с ресурсом RESTful. Но не смешивайте :id и :title в одном маршруте. Используйте только один параметр (или оба вместе, но это другая история).

map.resources :recipes, :except => [:show]
map.recipe '/recipe/:title', :controller => 'recipes', :action => 'show'

И вам, вероятно, потребуется переопределить метод to_param в вашей Recipe модели:

def Recipe < ActiveRecord::Base
  def to_param
     title
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...