2013-09-02 1 views
0

Возможно ли ограничение на необязательный параметр маршрута, который равен 'в середине' маршрута?Необязательный параметр с ограничением в середине маршрута Rails

Я хотел бы иметь следующий маршрут:

get ':city(/:suburb)/:venue_type', venue_type: /bar|restaurant|cafe/ 

Что бы показать список мест определенного типа, расположенный в городе, или необязательно иметь его сузили до пригорода. Единственный :venue_types, который я поддерживаю, это bar, restaurant и cafe.

Теперь я хотел бы достичь следующих отображений:

/nyc/manhattan/bar -> :city = nyc, :suburb = manhattan, :venue_type = bar 
/nyc/bar   -> :city = nyc, :suburb = (nil),  :venue_type = bar 
/nyc/whatever/cafe -> :city = nyc, :suburb = whatever, :venue_type = cafe 
/nyc/whatever  -> :city = nyc, :suburb = whatever, :venue_type = (nil) - routing error 

До сих пор я пытался с нижеследующим не делает работу:

class ValidSuburb 
    INVALID = %w[bar restaurant cafe] 
    def self.matches?(request) 
    request.params.has_key?(:suburb) && !INVALID.include?(request.params[:suburb]) 
    end 
end 
get ':city(/:suburb)/:venue_type', venue_type: /bar|restaurant|cafe/, suburb: ValidSuburb.new 

Возможно ли это быть достигнут на всех ограничениях или мне приходится прибегать к нескольким маршрутам?

ответ

1

Возможно, мне что-то не хватает, но было бы проще просто иметь 2 маршрута?

get ':city/:venue_type', constraints: { venue_type: /bar|restaurant|cafe/ } 
get ':city/:suburb/:venue_type', constraints: { venue_type: /bar|restaurant|cafe/ } 

Вот если что-нибудь, но "bar", "restaurant" или "cafe" передается как этот фрагмент после /nyc/.../bar, первый маршрут будет пропущен, что позволяет ему соответствовать ко второму маршруту.

Если передано /nyc/whatever, оно не будет соответствовать ограничениям/форматам любого маршрута, в результате чего вы получите RouteError.

+0

Да, это то, к чему мне прибегать. Однако я бы приветствовал ограниченное решение, поскольку мой «настоящий» маршрут пересекает несколько строк с несколькими параметрами, и было бы удобно не дублировать его. – mrt

+0

Вот почему это может быть лучше ** не **, чтобы опустить вашу проблему в определенных обстоятельствах. – deefour

Смежные вопросы