2013-03-08 14 views
9

Ho un'idea e un problema a cui non riesco a trovare risposta o soluzione. Alcune informazioni se necessario tardive e utile:best_in_place - usa il valore aggiornato in vista

  • Rails versione 3.2.9
  • best_in_place (git: //github.com/straydogstudio/best_in_place.git)
  • Rubino 1.9.3p327

Ok, quindi ho la pagina delle impostazioni in cui posso aggiornare le singole impostazioni modificandole con l'uso di best_in_place gem. Funziona bene. Felice con quello.

Alcune delle impostazioni sono interconnesse, ovvero, devo sommarle o sottrarle. Come suggerimento utile per l'utente, a mio avviso, proprio accanto al modulo sul posto per quelle impostazioni c'è anche un valore calcolato.

Ora, ovviamente, mi piacerebbe vedere questo valore essere aggiornato insieme all'attributo stesso. Non riesco a trovare un modo per farlo.

Se lo faccio con: data => funziona, ma ottengo il vecchio e non il nuovo valore, quindi la mia vista è sempre "1 passo indietro".

ho anche provato con update.js.erb e _test.html.erb parziale, ma il file javascript non funziona. È come se non esistesse. Ho doppio, triplo controllato dove metterlo ed è OK (app/views/controller/_partial.html.erb)

così. Una domanda piuttosto semplice sarebbe; come posso accedere a un valore aggiornato e utilizzarlo nuovamente per aggiornare i calcoli. Personalmente penso che dovrei andare con il file partial e js - ma non ho idea del motivo per cui il file JS non viene prelevato. Qualche idea su questo?

Se ci sono altre opzioni, vorrei più che apprezzare il suggerimento.

Grazie!

--edit (codice aggiunto)

vista:

<td> 
    <%= best_in_place @s,:pay_after_bonus, :display_with => :number_to_percentage, :type => :input, :nil => "Klikni tu za spremembo!", :cancel_button=> "Prekliči" %> 
    Cena: <span id="test"><%= number_to_currency(@s.family_member_price - ((@s.pay_after_bonus * @s.family_member_price)/100)) %></span> 
</td> 

settings_controller.rb:

def update 
    @s = Setting.find(params[:id]) 

    respond_to do |format| 
    @s.update_attributes params[:setting] 
    @s.create_activity :update, :params => { :setting => params[:setting].keys.first }, owner: current_user 
    format.json { respond_with_bip(@s) } 
    format.js 
end 
end 

update.js.erb:

$("#test").html("<%= escape_javascript(render(:partial => "update")) %>"); 

_update. html.Erb:

<strong>Test</strong> 

- EDIT 2:

OK, a quanto pare è possibile fare qualcosa di simile che voglio in questo modo:

$('.best_in_place[data-attribute="model_attribute"]').bind(
"ajax:success", function(event, data) { 
    // function that will update whatever 
}); 

in combinazione con

// respond to json request with 
render :json => {"model" => @model} 

&

"ajax:success", function(event, data) { 
var result = $.parseJSON(data); 
// from here the result var will be accessible with all the data returned by the controller. 
// result.model is your object - use result.model.attribute to get specific values... 
} 

Ma qui finisce per me. Non so come usare render: json => {"model" => @model} nel mio caso, poiché deve essere fatto in combinazione con format.json {respond_with_bip (@s)}.

Dove inserisco il rendering nel controller? Attualmente ricevo 500 errori interni del server cercando di farlo come risposta.

Ho trovato questa soluzione here.

Grazie !!

+0

È necessario mostrare il codice (html/js e controller). Senza di esso, possiamo solo fare supposizioni. Forse c'è un errore nel tuo codice JS che ti fa pensare che il tuo file non venga prelevato. –

+0

OK, ho aggiunto il codice pertinente.Thx –

risposta

-1

ho solo risposto a una domanda del genere:

Answer here

ma invece di inserire il valore è necessario utilizzare la somma di cui avete bisogno.

+0

questo non funzionerebbe per lo stesso motivo per cui la tua risposta sull'altra domanda non funzionerà – tehfoo

0

È possibile utilizzare jQuery per analizzare la dom per l'elemento più adatto appena modificato e ottenere il valore aggiornato da lì. Ad esempio, di voi hanno questo codice (Haml)

= best_in_place @user, :name, :classes => 'name-edit' 

Poi il callback sarebbe simile a questa (CoffeeScript)

$('.name-edit').on 'ajax:success', (event, data, status, xhr) -> 
    newValue = $('.name-edit').html # could also use .attr() here 
    $('.some-other-widget').html(newValue) # again could also set .attr here 

Si può anche saltare guardando il nuovo valore con jQuery. Nel contesto del gestore di callback, 'questo' rappresenta l'elemento della chiamata è stata fatta da, così si poteva solo fare

$('.name-edit').on 'ajax:success', (event, data, status, xhr) -> 
    $('.some-other-widget').html this.innerHTML 

e ottenere il nuovo valore per l'altro widget che modo. La mia ipotesi è che l'evento restituito dal gestore di ajax abbia anche currentTarget, che di nuovo sarebbe il widget che ha attivato la richiesta Ajax. La mia unica preoccupazione su tutto ciò sarebbe che il tuo gestore di successo in qualche modo batte il miglior gestore sul posto, e ottieni il widget prima che venga aggiornato. Nei miei test non è mai successo.

1

Nel callback ajax è possibile effettuare una nuova richiesta per ottenere il parziale che si desidera:

$('.best_in_place.myclass').bind("ajax:success", function() { 
    $.getScript("http://www.someurl.com"); 
}); 

Poi nell'azione rendere un file JS (ad es: show.js.erb), in cui si sostituisce la elemento target con i risultati del rendering:

$("#div-<%= @div.id %>").replaceWith("<%= escape_javascript(render(partial: 'some/partial', :layout => false)) %>"); 
Problemi correlati