2013-03-03 3 views
24

Die Verwendung von: alert (oder: notice) mit die render-Methode von Ruby On Rails Leitfaden ‚Layout und Rendering in Rails‘ bei http://guides.rubyonrails.org/layouts_and_rendering.html genannt, funktioniert nicht für michDie Verwendung von: alert (oder: notice) mit der render-Methode, aus dem Ruby On Rails Guide namens "Layouts und Rendern in Rails", funktioniert nicht für mich:

das ist der Beispielcode ist in der Führungs:

def index 
     @books = Book.all 
    end 

    def show 
     @book = Book.find_by_id(params[:id]) 
     if @book.nil? 
     @books = Book.all 
     render "index", :alert => 'Your book was not found!' 
     end 
    end 

ich ein Hallo habe Controller, der wie folgt aussieht:

class HelloController < ApplicationController 
     def index 
     @counter = 5 
     end 
     def bye 
     @counter = 4 
     render "index", :alert => 'Alert message!' 
     end 
    end 

Meine index.html.erb Blick sieht wie folgt aus:

<ul> 
    <% @counter.times do |i| %> 
     <li><%= i %></li> 
    <% end %> 
    </ul> 

Wenn http://localhost:3000/hello/bye Zugriff ich die Indexansicht zu sehen, das heißt, eine Liste von Zahlen von 1 bis 4 wie erwartet, aber es gibt keine ‚Warnmeldung!‘ Alarmanzeige.

Mein Layout verwendet diese Alarmmeldungen zeigen:

<% flash.each do |k, v| %> 
     <div id="<%= k %>"><%= v %></div> 
    <% end %> 

Antwort

20

Versuchen

def bye 
    @counter = 4 
    flash.now[:error] = "Your book was not found" 
    render :index 
    end 
+1

Thank you so much! –

22

Ich bin verwirrt, warum die Rails-Führer erwähnt Flash-Werte in render verwenden, da sie nur erscheinen Arbeiten Sie im Moment in redirect_to. Ich denke, Sie werden feststellen, dass Ihr Ansatz funktioniert, wenn Sie vor dem Aufruf der Rendermethode eine flash.now[:alert] = 'Alert message!' setzen.

Edit: Dies ist ein flaw in the guides that will be fixed, sollten Sie den separaten Methodenaufruf verwenden, um den Flash vor dem Aufruf Render zu setzen.

+2

Scheint, ein Fehler zu sein, der in der neuesten unveröffentlichten Version des Handbuchs behoben wurde: http://edgeguides.rubyonrails.org/layouts_and_rendering.html – Ari

+0

Danke Ari, habe gerade jetzt die Änderung gefunden. –

+0

Vielen Dank! –

4

Normalerweise würden Sie so etwas wie:

if @user.save 
    redirect_to users_path, :notice => "User saved" 
else 
    flash[:alert] = "You haz errors!" 
    render :action => :new 
end 

Was wollen Sie tun, um (und Ich mag diese Syntax viel besser):

if @user.save 
    redirect_to users_path, :notice => "User saved" 
else 
    render :action => :new, :alert => "You haz errors!" 
end 

... aber das ist nicht gültig für ActionController::Flash#render.

Aber, können Sie ActionController::Flash#render erweitern zu tun genau, was Sie wollen:

config/initializers/flash_renderer.rb erstellen mit folgendem Inhalt:

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 

Ref: http://www.perfectline.co/blog/2011/11/adding-flash-message-capability-to-your-render-calls-in-rails-3/