2012-06-27 11 views
8

Mam "zatwierdzenie" działania, które renderuje widok, który wyświetla zawartość z Modelu (klasy). W widoku mam link_to, który wywołuje accept z parametrem URL (: id). Po wykonaniu czynności accept (ustawia zatwierdzenie na wartość true), chcę ponownie wyświetlić approval z komunikatem ("Zapisano!"). Jednak w przeciwieństwie do statycznej strony logowania, działanie zatwierdzające wymaga paramu przy pierwszym wywołaniu. Przy drugim renderowaniu pojawia się błąd środowiska wykonawczego (oczywiście). Jaki jest najlepszy sposób, aby zadzwonić pod numer approval z informacją o treści flash?Renderowanie akcji za pomocą: zauważ, że zależy to od parametru URL

def approval 
    @c = Class.find(params[:id]) 
end 


def accept 
    @c = Class.find(params[:id]) 
    @c.approve = true 
    @c.save 

    render 'approval', :notice => "Saved!" 
end 
+0

Runtime error powodu id nie jest przekazywana do znalezienia @c w raz drugi. Możesz przekazać id. –

Odpowiedz

7

zmiana ta render 'approval', :notice => "Saved!" do

flash[:notice] = "Saved!" 
redirect_to :back 
+0

Co oznacza: powrót reprezentuje? –

+0

: wstecz - Powrót do strony, która wysłała żądanie. Przydatny w przypadku formularzy uruchamianych z wielu miejsc. Krótka ręka dla redirect_to (request.env ["HTTP_REFERER"]) – abhas

1

Exceprt od: http://www.perfectline.ee/blog/adding-flash-message-capability-to-your-render-calls-in-rails

Teraz wspólny wzór w kontrolerach wygląda następująco:

if @foo.save 
    redirect_to foos_path, :notice => "Foo saved" 
else 
    flash[:alert] = "Some errors occured" 
    render :action => :new 
end 

Co chcę móc zrób to:

if @foo.save 
    redirect_to foos_path, :notice => "Foo saved" 
else 
    render :action => :new, :alert => "Some errors occured" 
end 

Dodanie tej funkcjonalności jest całkiem proste - wystarczy utworzyć kod rozszerzający funkcję renderowania. Ten następny fragment kodu rozszerza moduł zawierający funkcje przekierowania.

module ActionController 
    module Flash 

    def render(*args) 
     options = args.last.is_a?(Hash) ? args.last : {} 

     if alert = options.delete(:alert) 
     flash[:alert] = alert 
     end 

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

     if other = options.delete(:flash) 
     flash.update(other) 
     end 

     super(*args) 
    end 

    end 
end 
Powiązane problemy