2012-04-19 6 views
13

Questo esercizio è stato un po 'complicato. Ho pensato di pubblicare la mia soluzione per vedere se qualcuno lo ha fatto in modo diverso o se c'è qualcuno che conosce un modo migliore.Aggiungere un display JavaScript alla Home page per il conto alla rovescia da 140 caratteri. (Rails Tutorial, 2nd Ed, Chapter 10, Exercise 7)

Non sono sicuro delle best practice per l'utilizzo di Asset Pipline. Ad esempio, l'ordine corretto di inserire le cose nel file manifest dell'applicazione .js o quando mettere le cose in lib contro app. Ho appena messo il seguente in lib per provare a farlo funzionare.


Da Michael Hartl's Rails Tutorial 2nd ed Capitolo 10, Esercizio 7:

(impegnativo) Aggiungi un display JavaScript alla Home page di conto alla rovescia da 140 caratteri.

In primo luogo, ho letto questo post about jQuery Twitter-like countdowns, che ha fornito il codice per farlo.

Avanti, ho aggiornato app/views/shared/_micropost_form.html.erb a guardare come questo:

<%= form_for(@micropost) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
     <%= f.text_area :content, placeholder: "Compose new micropost..." %> 
    </div> 
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
    <span class="countdown"></span> 

<% end %> 

Poi, ho creato una directory javascript in lib e file aggiunto

lib/attività /javascripts/microposts.js

function updateCountdown() { 
    // 140 is the max message length 
    var remaining = 140 - jQuery('#micropost_content').val().length; 
    jQuery('.countdown').text(remaining + ' characters remaining'); 
} 

jQuery(document).ready(function($) { 
    updateCountdown(); 
    $('#micropost_content').change(updateCountdown); 
    $('#micropost_content').keyup(updateCountdown); 
}); 

Infine, ho aggiunto un po 'di CSS

app/beni/fogli di stile/custom.css.scss

/* micropost jQuery countdown */ 

.countdown { 
    display: inline; 
    padding-left: 30px; 
    color: $grayLight; 
} 

Infine, aggiungere direttiva per le app/attività/javascript/application.js

//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require microposts 
//= require_tree . 

il risultato finale assomiglia a questo http://grab.by/dbC6


domanda: sarebbe sbagliato mettere il li manifesta nes after

Ad esempio, questo funziona ma non sono sicuro quale sarebbe la differenza, rispetto all'aggiunta della linea sopra l'albero.

//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require_tree . 
//= require microposts 
+4

Vorrei suggerire mettere le microposts.js file in app/assets/javascripts /, in questo modo non devi preoccuparti di aggiungere la riga aggiuntiva in app/assets/javascripts/application.js dato che verrà inclusa automaticamente tramite '// = require_tree .'. Altrimenti, sembra buono e funziona bene. – jonyamo

+0

Grazie per aver condiviso il tuo codice. L'ho fatto riferimento quando ho eseguito la mia implementazione del conto alla rovescia, che ho poi posto alcune domande su SO [qui] (http://stackoverflow.com/q/10955850/567863). Spero che se ti fornisca del materiale di riferimento nello stesso modo in cui la tua domanda ha fatto per me. –

risposta

1

È possibile semplificare utilizzando CoffeeScript:

/app/assets/javascripts/microposts.js.coffee

 
updateCountdown = -> 
    remaining = 140 - jQuery("#micropost_content").val().length 
    jQuery(".countdown").text remaining + " characters remaining" 

jQuery -> 
    updateCountdown() 
    $("#micropost_content").change updateCountdown 
    $("#micropost_content").keyup updateCountdown 

E come detto da jonyamo, non è necessario toccare la application.js come il //= require_tree . già fa il trucco.

1

Non so perché, ma questa soluzione ha funzionato solo con me usando la sceneggiatura del caffè. Ho provato a implementarlo con javascript, ma in qualche modo non ha visualizzato nulla: né il conto alla rovescia, né la parte fissa del testo "caratteri rimanenti".

Quindi ecco un riepilogo di quello che ho fatto.

Fase 1: creare un file app/javascript/microposts.js.coffee

updateCountdown = -> 
    remaining = 140 - jQuery("#micropost_content").val().length 
    jQuery(".countdown").text remaining + " characters remaining" 

jQuery -> 
    updateCountdown() 
    $("#micropost_content").change updateCountdown 
    $("#micropost_content").keyup updateCountdown 

NB: Essendo che il suo posto nella cartella app/javascript, non ho bisogno di aggiornare i application.js file.

Fase 2: aggiornare il _micropost_form.html.erb parziale:

<%= form_for(@micropost) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
     <%= f.text_area :content, placeholder: "Compose new micropost..." %> 
    </div> 
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
    <span class="countdown"></span> 
<% end %> 

passo 3: applicare un po 'di CSS al file custom_css.css.scss

/* micropost jQuery countdown */ 

.countdown { 
    display: inline; 
    padding-left: 10px; 
    color: $grayLight; 
} 

Fase 4: godere il risultato e sii felice che tutto funzioni :)

0

Ecco la mia versione di coffeescript basata sulla soluzione di Adriano. Questo ignora lo spazio bianco, non comporta l'aggiunta di div vuote nella vista e aggiunge anche una classe di errore una volta raggiunti i numeri negativi.

updateCountdown = -> 
    text = jQuery('#micropost_content').val() 
    text = text.replace(/\s/g, ''); 
    remaining = 140 - text.length 
    jQuery('.countdown').text remaining + ' characters remaining' 
    jQuery('.countdown').addClass 'alert alert-error' if remaining < 0 
    jQuery('.countdown').removeClass 'alert alert-error' if remaining > 0 

jQuery(document).ready -> 
    jQuery('#new_micropost').append '<span class="countdown">140 characters remaining</span>' 
    jQuery('#micropost_content').change updateCountdown 
    jQuery('#micropost_content').keyup updateCountdown 
    return 
1

mio microposts.js.coffee utilizza jQuery .css method per cambiare il colore dei caratteri rimanenti in base al valore della variabile remaining di rispecchiare più da vicino il comportamento dei twitter

updateCountdown = -> 
    remaining = 140 - jQuery("#micropost_content").val().length 
    jQuery(".countdown").text remaining + " characters remaining" 
    jQuery(".countdown").css "color", (if (140 >= remaining >= 21) then "gray") 
    jQuery(".countdown").css "color", (if (21 > remaining >= 11) then "black") 
    jQuery(".countdown").css "color", (if (11 > remaining) then "red") 

jQuery -> 
    updateCountdown() 
    $("#micropost_content").change updateCountdown 
    $("#micropost_content").keyup updateCountdown 

Grazie a tutti coloro che hanno risposto prima .

1

Ho usato il codice di Brett per farmi passare questo esercizio nell'esercitazione di Rails, anche se ho un piccolo cambiamento. Ho avuto problemi con il testo che scompare dall'elemento .countdown quando ho navigato su una pagina diversa, quindi di nuovo su Home. Con alcune ricerche minori e help from another answer on SO ho capito che la causa era Turbolinks. Il mio passaggio al codice di Brett, che si lega all'evento page:change anziché a ready, è riportato di seguito. Spero che questo aiuti alcune altre persone.

function updateCountdown() { 
    // 140 is the max message length 
    var remaining = 140 - jQuery('#micropost_content').val().length; 
    jQuery('.countdown').text(remaining + ' characters remaining'); 
} 

function micropostChange() { 
    $('#micropost_content').change(updateCountdown); 
} 

function micropostKeyup() { 
    $('#micropost_content').keyup(updateCountdown); 
} 

jQuery(document).ready(function($) { 
    updateCountdown(); 
    micropostChange(); 
    micropostKeyup(); 
    jQuery(document).on('page:change', function($) { 
    updateCountdown(); 
    micropostChange(); 
    micropostKeyup(); 
    }); 
}); 
0

Al fine di evitare meno nel carattere conto alla rovescia ho aggiunto questo limite a _micropost_form.html.erb parziale, in modo che si ferma a 140 caratteri:

<%= f.text_area :content, maxlength:140, placeholder: "Compose new micropost..." %> 
Problemi correlati