2016-08-11 1 views
0

Ich versuche, die Rails Flash-Hinweis in meiner Anwendung nur mit JavaScript zu erhalten. Ich habe ein Formular, das remote: true nutzt, um eine AJAX-Anfrage an den Controller beim Einreichen zu stellen. Die Form sieht aus wie das Beispiel unten gezeigt:Flash-Benachrichtigung in Rails mit [Aktion] .js.erb aufrufen

# app/views/_email_register.html.erb 
    <%= simple_form_for :email, url: emails_path, remote: true do |f| %> 
    <div class="modal-body"> 
     <div class="form-group"> 
     <%= f.input :address, as: :email, placeholder: '[email protected]', label: false %> 
     </div> 
    </div> 
    <div class="modal-footer"> 
     <%= f.submit 'Subscribe', class: 'btn btn-primary btn-block' %> 
    </div> 
    <% end %> 

Die Rails-Anwendung wurde Schienen-Komponist generiert verwendet, die auch Bootstrap CSS installiert.

# app/controllers/emails_controller.rb 
    def create 
    @email = Email.new(email_params) 
    respond_to do |format| 
     if @email.save 
     format.html { redirect_to :back, notice: 'Email was successfully registerd' } 
     format.js 
     else 
     format.html { render :new } 
     format.js 
     end 
    end 
    end 

Die Steuerung ruft dann die create.js.erb als Teil des respond_to Blocks.

# app/views/emails/create.js.erb 
    // flash to user it was successful 
    $(".alert").html("Email was successfully registered"); 

Der _messages.html.erb Teil wurde automatisch aus Rails-Composer generiert. Nicht sicher, ob diese teilweise aus dem JavaScript

# app/views/layouts/_messages.html.erb 
<% flash.each do |name, msg| %> 
    <% if msg.is_a?(String) %> 
    <div class="alert alert-<%= name.to_s == 'notice' ? 'success' : 'danger' %>"> 
     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> 
     <%= content_tag :div, msg, :id => "flash_#{name}" %> 
    </div> 
    <% end %> 
<% end %> 

aufgerufen werden Jede mögliche Unterstützung, wie ich die Flash-Mitteilung über JavaScript bekommen zu zeigen, würde sehr geschätzt werden.

Antwort

1

Sie müssen nur die teilweise neu rendern, die die Flash-Nachrichten in Ihrem js.erb macht

# app/views/emails/create.js.erb 
$('.flash_wrapper').html("<%= escape_javascript(render 'layouts/messages') %>"); 

In Ihrem Controller setzen Sie den Blitz

format.js { flash.now[:notice] = 'Email was successfully registered' } 

Dies wird Ihnen blinken

zeigen

HINWEIS:.flash_wrapper ist Ihr Wrapper, wo Sie die _message teilweise rendern.

+0

Vielen Dank für die schnelle Antwort. Ich habe versucht, '$ ('# flash_notice') hinzuzufügen. Html (" <% = escape_javascript (render 'layouts/messages')%> ");', aber die von der Steuerung zurückgegebene JS ist die folgende '$ ('# flash_notice '). html (""); 'Es scheint, dass kein' flash'-Objekt durchlaufen werden muss. – Knoxville

+0

@Knoxville legte den Blitz mit 'format.js' –

+0

Danke! Dies ist, was ich getan habe und es funktioniert gut für mich, bitte beraten, wenn das richtig ist: 'format.js {flash.now [: notice] = 'Email erfolgreich registriert wurde'}' – Knoxville