Нет хорошего способа удалить часть контроллера / id ресурса. Самое близкое, что вам предстоит сделать, - обмануть ActionController примерно так:
map.resources :gray, :path_prefix => "/images/:product/:image_id/",
:controller => 'images', :requirements => {:colour => "gray"}
, который будет производить маршруты типа www.site.com/images/product/4/gray/1234.html
со следующим хешем params:
params => {
:image_id => 4,
:id => 1234,
:colour => "gray",
:product => "product"
}
Формат не будет передан в явном виде, но он будет доступен в контроллере с помощью обычно средства response_to.
Затем вам нужно будет поработать над магией в контроллере, чтобы обманным путем заставить вас делать то, что вы хотите.
class ImagesController < ApplicationController
def show
@size = params[:id]
@image = Image.find(params[:image_id])
...
end
end
Это на самом деле лучше работает как фильтр так:
class ImagesController < ApplicationController
def initialize_colour
unless params[:colour].nil?
@size = params[:id]
@colour = params[:colour]
@image = Image.find(params[:image_id])
end
end
before_filter :initialize_colour, :except => [:index, :new, :create]
...
end
Однако, чтобы эффективно использовать эти маршруты, вам придется передать все эти дополнительные параметры в ваш URL для вызовов. Как это:
gray_url(size, :image_id => @image.id, :product => product)
Но помощники делают это легко.
module ApplicationHelper
def easy_gray_url(image, size, product)
gray_url(size, :image_id => image.id, :product => product)
end
end