default_url_options e rails 3

Come ActionController::Base#default_url_options è deprecato, mi chiedo come impostare l’url predefinito di opzioni in rails3. L’url di default le opzioni non sono statici, ma dipendente della richiesta corrente.

http://apidock.com/rails/ActionController/Base/default_url_options

Grazie,
Corin

InformationsquelleAutor gucki | 2011-05-23

 

5 Replies
  1. 24

    Per impostare l’url di opzioni per la richiesta corrente usare qualcosa come questo, in un controllore:

    class ApplicationController < ActionController::Base
    
      def url_options
        { :profile => current_profile }.merge(super)
      end
    
    end

    Ora :profilo => current_profile sarà automerge percorso/url parametri.

    Esempio di routing:

    scope ":profile" do
      resources :comments
    end

    Basta scrivere:

    comments_path

    e se current_profile ha impostato to_param di ‘lucas’:

    /lucas/comments
    • Grazie! È questo il “ufficiale” di rails 3.0/3.1 modo?
    • Troppo male, viene generata un’eccezione quando è stata dichiarata protetta che è un must, altrimenti è esposto come un’azione). Così non funziona.
    • A me funziona in un progetto vero e proprio, non so perché pensi che espone come un’azione, basta rimuovere il routing di default /:controller/(:azione) dai percorsi. Questo metodo deve essere pubblico.
    • È anche lavorando per la posta, basta definire il metodo in una sottoclasse di ActionMailer::Base 🙂
    • Come impostare le opzioni in base al modello di attributo. Ad esempio, impostare :profile per comment.user.city_name, in modo da ottenere /newyork/comments/123?
    • comments_path(:profilo => commento.utente.city_name, :id => commento.id)
    • ma come è possibile impostare la variabile di istanza per current_profile?

  2. 24

    Credo che il metodo preferito è ora di dire al router per gestire questo:

    Rails.application.routes.default_url_options[:foo]= 'bar' 

    Si può mettere questa riga routes.rb o un inizializzatore. A seconda di quale si preferisce. Si potrebbe anche metterlo nel vostro ambiente configs se i valori cambiano in base al proprio ambiente.

    • Ma come posso fare questa dipende la richiesta corrente, così, per esempio, accedere a variabili di istanza?
    • Yeps, non è thread-safe. L’ho fatto attraverso il metodo personalizzato e Filo.corrente
    • Questo aspetto è per Rails 3.2.
    • Domanda stupida: dove inserisci di questa linea? Nelle rotte.rb? In un inizializzatore?
    • Questo ha funzionato grande per Rails 4
    • Se è necessario impostare questo il config livello, come si fa a passare in una dinamica account_id? Per esempio scope '/:account_id' – Come vorreste essere in grado di impostare account_id dinamicamente alla config livello?
    • Ho appena messo questo in Applicazione del Controller e ha funzionato per me. Non sono sicuro se questo è il posto giusto per farlo, ma funziona.
    • Si può mettere questa riga routes.rb o un inizializzatore. A seconda di quale si preferisce. Si potrebbe anche metterlo nel vostro ambiente configs se i valori cambiano in base al proprio ambiente.
    • Questo non funziona più rapido per Guide 5.1.4 per il rendering delle pagine, ma funziona solo per i binari di console.

  3. 0

    Per Rails 3, in particolare, la canonica modo per farlo è con l’aggiunta di un default_url_options metodo per la ApplicationController.

    class ApplicationController < ActionController::Base
      def default_url_options
        {
            :host => "corin.example.com",
            :port => "80"  #  Optional. Set nil to force Rails to omit
                           #    the port if for some reason it's being
                           #    included when you don't want it.
        }
      end
    end

    Ho dovuto capire questo fuori di me, quindi so che funziona.

    Questo è un adattamento del Rails 3 Guida:

    http://guides.rubyonrails.org/v3.2.21/action_controller_overview.html#default_url_options

  4. 0

    Rails.application.routes.default_url_options[:host]= 'localhost:3000'

    In developemnt.rb /test.rb, può essere più conciso come segue:

    Rails.application.configure do
      # ... other config ...
    
      routes.default_url_options[:host] = 'localhost:3000'
    end

Lascia un commento