In Rails 3, ist es möglich, Zugriff auf den Controller/Aktion der URL innerhalb von default_url_options() generiert werden? In Rails 2 wurde ein Hash der Optionen übergeben, die an url_for() übergeben werden sollten, die Sie natürlich ändern könnten.Rails 3 - default_url_options basierend auf URL generiert
z. Rails 2 Code:
==== config/routes.rb
map.foo '/foo/:shard/:id', :controller => 'foo', :action => 'show'
==== app/controllers/application.rb
def default_url_options options = {}
options = super(options)
if options[:controller] == 'some_controller' and options[:id]
options[:shard] = options[:id].to_s[0..2]
end
options
end
==== anywhere
foo_path(:id => 12345) # => /foo/12/12345
jedoch in Schienen 3, dass gleiche Code aufgrund der Tatsache nicht, dass default_url_options keine Optionen Hash übergeben, und ich habe noch herausfinden, wie zu testen, was die Steuerung ist.
FWIW, das obige "sharding" liegt daran, wenn Sie Caching einschalten, wenn Sie eine große Anzahl von foo Zeilen in Ihrer DB haben, dann werden Sie die Inode-Grenze auf Unix-basierten Systemen für die Anzahl von erreichen Dateien in 1 Ordner irgendwann. Die korrekte "Reparatur" hier ist wahrscheinlich, die Cache-Einstellungen zu ändern, um die Datei im sharded Pfad zu speichern, anstatt die Route komplett zu zerlegen. Zu der Zeit, als ich den obigen Code schrieb, war ein Teil von mir der Meinung, dass es nett war, die zwischengespeicherte Datei immer in der gleichen Struktur wie die Route zu haben, falls Sie jemals etwas außerhalb von Rails wollten, um den Cache zu bedienen.
Aber ach, ich wäre immer noch an einer Lösung für das Obige interessiert, nur weil es mich frisst, dass ich es nicht herausfinden konnte.
Edit: Derzeit habe ich die folgenden, die ich muss Graben, da Sie alle anderen named_route-Funktionalität verlieren.
==== config/routes.rb
match 'foo/:shard/:id' => 'foo#show', :as => 'original_foo'
==== app/controllers/application.rb
helpers :foo_path
def foo_path *args
opts = args.first if opts.is_a?(Array)
args = opts.merge(:shard => opts[:id].to_s[0..2]) if opts.is_a?(Hash) and opts[:id]
original_foo_path(args)
end
Sicher, dann muss ich ALLE Anrufe ändern zu foo_path(). Wenn Sie link_to() überschreiben, hat es keinen Sinn, named_routes überhaupt zu haben. – tigris
Oh, und ich muss den Pfad auch außerhalb von Links, z. von Controllern, so können Sie einfach '' 'expire_cache_path foo_path (: id => 12345)' '' – tigris
Das Prinzip ist das gleiche, Sie passen die 'foo_path' in' FooHelper' – deepfryed