2012-12-01 19 views
5

Ich habe ein Firmenmodell, das viele Tags haben kann. Es funktioniert gut, aber in einem Fall funktioniert es nicht. Der Anlass ist, wenn die Validierung des Unternehmensmodells fehlschlägt. Nach: render => 'edit' zeigt es keine Tags in der Ansicht an. Ich vermute, dass das Daten-Pre die Daten nicht korrekt aufnimmt. Ich möchte auch, dass Tags beim Lösen von Validierungen erhalten bleiben.Ruby on Rails - JS-Eingabe-Token, ein Problem, wenn die Validierung fehlschlägt

Ich habe diese Idee von hier: http://railscasts.com/episodes/167-more-on-virtual-attributes

I Eingang Token Steuerung verwenden: http://loopj.com/jquery-tokeninput/

Dies ist, was ich in Gesellschaft Modell haben die tag_tokens zu:

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 

Hier ist der Code aus der Sicht:

<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, so sehe ich, was ist das Problem mit dem obigen Code.

Wenn ich bearbeiten Seite Daten-Pre enthält dies: data-pre="[{&quot;id&quot;:1704,&quot;name&quot;:&quot;dump truck&quot;}]". Wenn ich das Formular mit Validierungsfehler übergebe, enthält das Daten-Pre: data-pre="1704".

wenn ich ändern Sie den Code dazu:

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

neue Tags, die noch nicht an das Unternehmensmodell speichern wurden, werden entfernt, da sie von der DB jedes Mal gelesen werden. Wie kann ich die eingegebenen Daten zwischen Formularübergängen speichern?

+0

kann jemand helfen? – MJM

Antwort

1

OK, ich habe eine Lösung geschrieben, es ist vielleicht nicht die schönste, aber es funktioniert mir! Es analysiert den Eingabe-Token-Wert im JSON-Format (wenn die Validierung fehlschlägt), der beim Laden der Seite verwendet wird. Beim Laden der Seite werden nur Tags aus der DB geladen.

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