0

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 

Antwort

0

einen Helfer wie

definieren
# app/helpers/foo_helper.rb 
module FooHelper 
    def link_to name, options = {}, &block 
    options[:shard] = options[:id].to_s[0..1] if options[:id] 
    super name, options, &block 
    end 
end 

und führen Sie dann scheint die folgende in Ihrer Sicht für mich

<%= link_to("my shard", id: 12345) %> 

bearbeiten zu arbeiten: oder die foo_path als

module FooHelper 
    def link_to name, options = {}, &block 
    options[:shard] = options[:id].to_s[0..1] if options[:id] 
    super name, options, &block 
    end 

    def foo_path options = {} 
    options[:shard] = options[:id].to_s[0..1] if options[:id] 
    super options 
    end 
end 
anpassen
+0

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

+0

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

+0

Das Prinzip ist das gleiche, Sie passen die 'foo_path' in' FooHelper' – deepfryed