5

ich diese Bibliothek verwenden, (https://github.com/CodeSeven/toastr) und ich versuche, meine Flash-Mitteilungen an die JavaScript-Funktion zu drücken Toastr für mich zur Verfügung gestellt haben. Wie rufe ich diese Funktion für jeden Fehler oder jede Benachrichtigung auf?Rails 4 - Toaster Benachrichtigungen statt Flash-Benachrichtigungen

Dies ist eine der Methoden, die zur Herstellung eines Toaster Benachrichtigung verwendet werden:

toastr.warning('This is a warning!') 

Ich habe versucht, eine Methode in der Application machen, um zu sehen, ob ich diese Methode auf Standardfehler von CanCan nennen könnte. Ich habe verschiedene Versionen der Methode, von denen keine funktionierte.

def toast(type, text) 
    #if Logic here for various errors/notifications 
    respond_to do |format| 
     format.js { render action: "toastr.warning(#{text})", layout: false} 
    end 
end 

def toast(type, text) 
    #if Logic here for various errors/notifications 
    "toastr.warning(#{text})" 
end 

Und dann versuche ich im CanCan Block diese Methode zu verwenden:

rescue_from CanCan::AccessDenied do |exception| 
    toast :error, exception.message 
    redirect_to root_url 
end 

Ich würde davon ausgehen, dass dies möglich ist, aber ich bin nur nicht sicher, wie es zu implementieren. Nicht viele versuchen das, und es gibt wahrscheinlich einen Grund. Ich bin offen für alle Vorschläge, wie zu tun, was ich zu tun versuchen.

Hier ist eine Testanwendung, die die Toast-Benachrichtigungen implementiert: http://codeseven.github.io/toastr/demo.html

Antwort

4

Was ich empfehlen würde, ist einen neuen flash Typen für diese Art der Sache zu machen und dann machen, dass als JS in Ihrem Layout.

ApplicationController 

def toast(type, text) 
    flash[:toastr] = { type => text } 
end 


app/views/layouts/<your layout>.html.erb 
# (or in a partial to be reused in various layouts) 
# the <script> tag isn't needed if code snippet is 
# included in an existing script block, of course. 

<% if flash[:toastr] %> 
    <script type="text/javascript"> 
    <% flash[:toastr].each do |type, message| %> 
     toastr.<%= type %>(<%= message.inspect %>) 
    <% end %> 
    </script> 
<% end %> 

Also diese Weise erhalten Sie all Standardverhalten Sie aus dem flash Objekt verwendet, und Sie bekommen einfach Javascript in Ihrer Ansicht über erb direkt geschrieben zu verstehen. Möglicherweise müssen Sie einen Options Hash mit der ApplicationController#toast Methode hinzuzufügen, so dass Sie ein flash.now[:toastr] manchmal tun können, natürlich. Und so weiter ... Aber das sollte dich beginnen.

+0

Mit ein wenig zwicken wie das Hinzufügen von 'Raw' auf dem' message.inspect'. Ich habe es zur Arbeit gebracht. Danke für die Hilfe! – Rizowski