2012-12-01 12 views
5

私は多くのタグを持つことができる会社のモデルを持っています。それは正常に動作しますが、1つの機会にそれは動作しません。この機会は、企業モデルの検証に失敗したときです。後:render => 'edit'は、ビュー内のタグを表示しません。データpreがデータを正しく取得していないと思われます。バリデーションを解決する際にタグを保存することも欲しいと思います。Ruby on Rails - JS入力トークン、検証に失敗したときの問題

私はここからこのアイデアを得た:http://railscasts.com/episodes/167-more-on-virtual-attributes

私は入力トークンコントロールを使用します。http://loopj.com/jquery-tokeninput/

は、これは私が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 

コードですビューから:

<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ですが、私は上記のコードに問題があるのを見ています。

ページ編集データを読み込むときには、 - data-pre="[{&quot;id&quot;:1704,&quot;name&quot;:&quot;dump truck&quot;}]"が含まれています。検証エラーのあるフォームを送信すると、data-preにはdata-pre="1704"が含まれます。

が、私はこれにコードを変更した場合:まだ会社のモデルに保存されていなかった

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

新しいタグを除去して、それらはDB毎回から読み込まれるため。フォーム遷移間に入力したデータを保存するにはどうすればよいですか?

+0

誰でも助けますか? – MJM

答えて

1

OK、私は解決策を書いていますが、これは一番良い方法ではないかもしれませんが、それは私にとって効果的です!入力トークンの値をJSON形式に解析します(検証が失敗した場合)。これはページのロード時に使用されます。ページの読み込みでは、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 
関連する問題