2010-10-03 8 views
11

W Railsach 3 można przekazywać atrybuty bezpośrednio do redirect_to, aby ustawić lampę błyskową. Na przykład:Jak zezwolić na niestandardowe klawisze flash w przekierowaniu na połączenie w Railsach 3

redirect_to root_path, :notice => "Something was successful!" 

Jednak ta działa tylko z :alert i :notice kluczy; jeśli chcesz korzystać z niestandardowych klawiszy, trzeba użyć bardziej opisowy wersję:

redirect_to root_path, :flash => { :error => "Something was successful!" } 

Czy istnieje jakiś sposób, aby uczynić go tak, że niestandardowe przyciski (takie jak :error powyżej) mogą być przekazywane do redirect_to bez określania go w :flash => {}?

Odpowiedz

25

W Rails 4 Można to zrobić

class ApplicationController < ActionController::Base 
    add_flash_types :error, ... 

a potem gdzieś

redirect_to root_path, error: 'Some error' 

http://blog.remarkablelabs.com/2012/12/register-your-own-flash-types-rails-4-countdown-to-2013

+0

Awesome! Oznaczając to jako zaakceptowaną odpowiedź, ponieważ powinno być używane w przyszłości. –

+0

im uruchomiono problem, w którym nazwałem typ flash: login, ale mam też metodę logowania się z "magicznego klejnotu". może dodawanie typów flash z tym, że w tej chwili nie jest tak wspaniałe? – dtc

+0

Mówiąc o wydajności lub właściwej drodze do osiągnięcia tego samego zachowania, jaki jest najlepszy sposób, aby przejść: ** 1.- Dodawanie nowych typów flash ** jak z 'add_flash_types: error, ...' lub ** 2.- Dodanie nowych skrótów w obiekcie Flash ** jak w przypadku ': flash => {: error =>" O nie! " } '? –

8

Użyłem poniższy kod, umieszczony w lib/core_ext/rails/action_controller/flash.rb i ładowane za pośrednictwem inicjatora (to przepisać z wbudowanym kodem Rails):

module ActionController 
    module Flash 
    extend ActiveSupport::Concern 

    included do 
     delegate :alert, :notice, :error, :to => "request.flash" 
     helper_method :alert, :notice, :error 
    end 

    protected 
     def redirect_to(options = {}, response_status_and_flash = {}) #:doc: 
     if alert = response_status_and_flash.delete(:alert) 
      flash[:alert] = alert 
     end 

     if notice = response_status_and_flash.delete(:notice) 
      flash[:notice] = notice 
     end 

     if error = response_status_and_flash.delete(:error) 
      flash[:error] = error 
     end 

     if other_flashes = response_status_and_flash.delete(:flash) 
      flash.update(other_flashes) 
     end 

     super(options, response_status_and_flash) 
     end 
    end 
end 

Można oczywiście dodać więcej klawiszy oprócz właśnie :error ; sprawdź kod pod numerem http://github.com/rails/rails/blob/ead93c/actionpack/lib/action_controller/metal/flash.rb, aby zobaczyć, jak funkcja wyglądała pierwotnie.

Powiązane problemy