2016-09-09 5 views
0

die Schienen Mit Guss http://railscasts.com/episodes/324-passing-data-to-javascript?autoplay=truePass Variablen in JavaScript Schienen

eine Variable aus meinem Controller Javascript passieren.

Ich habe eine Schaltfläche, wenn ich darauf klicke, möchte ich die Anzahl der Upvotes anzeigen.

Im mit Gon.

Wenn ich versuche, es jedoch zu laufen, sagt mein Alarm die Variable nicht einmal definiert ist, obwohl ich es in der Steuerung

_source.html.erb

<div class="panel-body"> 
    <%= include_gon(:init => true) %> 
    <%=source.source %> 
    <% @count = pluralize(source.upvotes.count,"upvote") %> 
    <div id="count"><%= @count %></div> 
    <%= button_to '+1', upvote_source_path(source), method: :post,remote: true %> 

    <p><%= link_to "delete", [source.fact, source], method: :delete, data:{confirm: "are you sure?"} %></p> 
    </div> 

application.html.erb

gesetzt
<!DOCTYPE html> 
<html> 
    <head> 
    <title>Sourcemonkey</title> 
    <%= include_gon(:init => true) %> 
    <%= csrf_meta_tags %> 

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> 
    </head> 

    <body> 
    <%= yield %> 
    </body> 
</html> 

sources_controller.rb -> upvotes Aktion

def upvote 
     @source = Source.find(params[:id]) 
     @source.upvotes.create 
     gon.count = @source.upvotes.count 
     respond_to do |format| 
     format.js {render :js =>"upDateCount()"} 
     format.html { redirect_to :none} 
     end 
    end 

upvote.js.erb

function upDateCount(){ 
    alert(gon.count) 
} 

routes.rb

Rails.application.routes.draw do 
    # mount Ckeditor::Engine => '/ckeditor' 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    root to: "facts#index" 

    resources :facts do 
    resources :sources 
    end 

    resources :sources do 
    member do 
     post 'upvote' 
    end 
    end 

    resources :upvote 
end 

Ideen schätzen, dank

Antwort

1

In diesem Fall könnte es einfacher sein passieren upvote zu upDateCount zählen

format.js {render :js =>"upDateCount(#{@source.upvotes.count})"} 

und verwenden th Das Argument anstelle von gon Daten.

+0

Das funktioniert, danke !!!! Ich bin neugierig zu wissen, warum dieser Fall speziell ist und Gon wird nicht empfohlen, wenn Sie wissen? – mogoli

+0

Ich benutze 'format.js' nicht, ich neige dazu, mit Daten zu antworten, nicht mit Skripten, weshalb ich das nicht genau weiß. Ich nehme an, dass von Controllern gerenderte Skripte in einem anderen Kontext ausgewertet werden als statische Skripte. – mrzasa

+0

Vielen Dank für die Erklärung, ich bin mit Schienen beginnen, so schätzen die Einsicht – mogoli