2012-12-01 14 views
5

Ho un modello aziendale che può avere più tag. Funziona bene, ma in un'occasione non funziona. L'occasione è quando la convalida del modello aziendale fallisce. Dopo: render => 'edit' non mostra i tag nella vista. Sospetto che data-pr non stia prendendo i dati correttamente. Mi piacerebbe anche che i tag fossero conservati quando si risolvono le convalide.Ruby on Rails - Token di input JS, un problema quando la convalida fallisce

Ho avuto questa idea da qui: http://railscasts.com/episodes/167-more-on-virtual-attributes

Io uso di input di controllo token: http://loopj.com/jquery-tokeninput/

Questo è quello che ho nel modello di impresa per quanto riguarda i tag_tokens:

before_save :save_tag_tokens 
    attr_writer :tag_tokens 
    attr_accessible :tag_tokens 

    def tag_tokens 
    @tag_tokens || tags.to_json(:only => [:id, :name]) 
    end 

    def save_tag_tokens 
    if @tag_tokens 
     @tag_tokens.gsub!(/CREATE_(.+?)_END/) do 
     Tag.create!(:name => $1.strip.downcase).id 
     end 
     self.tag_ids = @tag_tokens.split(",") 
    end 
    end 

ecco il codice dal punto di vista:

<div class="input text no-border"> 
    <% Tag.include_root_in_json = false %> 
    <%= company_form.label :tag_tokens, t('form.account.company.edit.company_tags_html')%> 
    <%= company_form.text_field :tag_tokens, :id => 'company_tag_tokens', "data-pre" => @company.tag_tokens%> 
    <p class="tip"><%= t('form.account.company.edit.tag_tip') %></p> 
    </div> 

ED IT:

OK, quindi vedo qual è il problema con il codice precedente.

Quando carico i dati della pagina di modifica-pre contiene questo: data-pre="[{&quot;id&quot;:1704,&quot;name&quot;:&quot;dump truck&quot;}]". quando invio il modulo con errore di convalida, il data-pre contiene: data-pre="1704".

se cambio il codice a questo:

def tag_tokens 
    tags.to_json(:only => [:id, :name]) 
end 

nuovi tag che non sono stati ancora Salva per il modello di società vengono rimossi, perché sono letti dal DB ogni volta. Come posso conservare i dati inseriti tra le transizioni del modulo?

+0

qualcuno può aiutare? – MJM

risposta

1

OK, ho scritto una soluzione, potrebbe non essere la più bella, ma funziona per me! Analizza il valore del token di input nel formato JSON (quando la convalida non riesce), che viene utilizzato durante il caricamento della pagina. Sotto caricamento pagina carica solo tag dal DB.

def tag_tokens 
    if @tag_tokens 
     #if there is user info, parse it to json format. create an array 
     array = @tag_tokens.split(",") 
     tokens_json = [] 
     #loop through each tag and check if it's new or existing 
     array.each do |tag| 
     if tag.to_s.match(/^CREATE_/) 
      #if new generate json part like this: 
      tag.gsub!(/CREATE_(.+?)_END/) do 
      tokens_json << "{\"id\":\"CREATE_#{$1.strip.downcase}_END\",\"name\":\"Add: #{$1.strip.downcase}\"}" 
      end 
     else 
      #if tag is already in db, generate json part like this: 
      tokens_json << "{\"id\":#{tag},\"name\":\"#{Tag.find_by_id(tag).name}\"}" 
     end 
     end 
     #encapsulate the value for token input with [] and add all tags from array 
     "[#{tokens_json.to_sentence(:last_word_connector => ',', :words_connector => ',', :two_words_connector => ',')}]" 
    else 
     #if there is no user input already load from DB 
     tags.to_json(:only => [:id, :name]) 
    end 
    end