Dynamiczne generowanie routes

Mam taki problem - potrzebuje generowac dynamicznie sciezki, czyli w pliku config/routes.rb jest coś takiego

get “/:category_id” => ‘categories#show’, :constraints => { :id => /Category.some_categories.map(&:friendly_id).compact.join(’|’)/ }, :as => :named_category

i wszystko jest ok, dziala jak ma dzialac, a problem zaczyna sie gdy dodawana jest nowa kategoria w trybie produkcyjnym. (po restarcie server-a jest ok)

Probowalem to objesc przez wywołanie - Rails.application.reload_routes!, zaawansowane constraints, ale bez efektu.

Spróbuj:

get "/:id" => 'categories#show', :constraints => CategoryConstraint.new, :as => :named_category

class CategoryConstraint def matches?(request) Category.some_categories.map(&:friendly_id).compact.include?(request.params[:id]) end end

Jezu… oszaleli… :o

[code=ruby]# routes.rb
get ‘/:id’ => ‘category#show’

categories_controller.rb

def show
Category.some_categories.find(params[:id])
end[/code]
po co ten constraint? tak i tak jeżeli nie ma kategorii o danym id appka rzuci 404

morgoth - próbowałem tego rozwiązania i nadpisuje ono dalsze ścieżki.

zlw - konstruktywna krytyka mile widziana, Twoja nie jest nawet na temat, w kodzie uzyte sa ‘friendly_id’

i?

params[:id] niekoniecznie musi być liczbą, to może być równie dobrze string (właściwie to zawsze jest string, ewentualnie zawierający tylko liczbę ;)) a dla modelu ganz egal czy zrobisz

[code=ruby]Model.find(1)

czy

Model.find(‘foo-bar’)[/code]
to co próbujesz zrobić jest a) złe b) niemożliwe. na produkcji routes są generowane przy starcie aplikacji i musiałbyś się pewnie nieźle nagimnastykować żeby je przeładować (tylko po co?!).

damian: też nie rozumiem problemu. Jeżeli chodzi Ci o to, żeby ten route nie przysłonił zwykłych ścieżek, to musisz go dać z najniższym priorytetem, tzn. na samym dole pliku. Jedyna większa różnica jest taka, że przy takiej konfiguracji dostaniesz wyjątek RecordNotFound, a przy takiej, którą chciałeś uzyskać, router nie będzie umiał znalźć ścieżki. Dla użytkownika to nie ma znaczenia, więc nie ma chyba różnicy co zastosujesz.

o to to to, dokładnie wcześniej już napisałem :slight_smile: użytkownik i tak dostanie stronę 404 więc takie “dziwne zabawy” są bez sensu :wink:

Czyli bardzo dobrze bo to chcesz osiagnac masz tam out of the box

http://rubydoc.info/github/norman/friendly_id/master/file/Guide.rdoc

Właściwie to może być ku temu jeden dobry powód - jeżeli masz bardzo duży plik routes.rb, a chcesz, żeby ten url był otwierany jak najszybciej, to może mieć to sens. Ale podejrzewam, że to jest bardzo mały procent takich przypadków i dodatkowo sama akcja musiałaby być bardzo szybka, bo inaczej różnica w routingu nie ma znaczenia (np. w porównaniu z dostępem do bazy danych).

A więc, żeby wyjśnić, applikacja oprata jest o refinery cms gdzie jest bardzo duzo własnych enginów z własnymi routsami.
Routsy dane są z najmniejszym priorytetem (na samym dole pliku) i po to jest dane constraints, żeby łapało to tylko wyznaczonych ścieżek, a nie wszystko jak leci, bo refinery generuje swoje ścieżki. Mam nadzieje że to rzuciło nowe światło na problem i mi własnie chodzi dokładnie o ta dodatkową gimnastyke, inaczej zamieściłbym to pytanie w zielonej szkole :wink: