2012-12-01 2 views
5

많은 태그를 포함 할 수있는 회사 모델이 있습니다. 그것은 잘 작동하지만 한 경우에는 작동하지 않습니다. 이 기회는 회사 모델 유효성 검사가 실패하는 경우입니다. 이후 : render => 'edit'뷰에 태그를 표시하지 않습니다. 데이터 pre가 데이터를 올바르게 가져 오지 못하는 것 같습니다. 유효성 검사를 해결할 때 태그가 보존되기를 바랍니다.Ruby on Rails - JS 입력 토큰, 유효성 검사가 실패 할 때의 문제점

는 여기에서이 아이디어를 가지고 : http://loopj.com/jquery-tokeninput/

이 내가 tag_tokens에 대한 회사의 모델이 무엇 : http://railscasts.com/episodes/167-more-on-virtual-attributes

내가 입력 토큰 컨트롤을 사용하여 다음

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 :

위의 코드에서 문제가 무엇인지 확인합니다. data-pre="[{&quot;id&quot;:1704,&quot;name&quot;:&quot;dump truck&quot;}]" :

내가 편집 페이지 데이터 사전이 포함되어로드 할 때. 유효성 검사 오류가있는 양식을 제출하면 데이터 사전에 data-pre="1704"이 포함됩니다.

내가이에 코드를 변경하는 경우 : 아직 회사의 모델에 저장되지 않은

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

새로운 태그를 제거, 그들이 DB 매번 읽기 때문이다. 양식 전환 사이에 입력 된 데이터를 보존하려면 어떻게해야합니까?

+0

을 도와 드릴까요? – MJM

답변

1

확인, 나는 그것이 좋은 일하지 않을 수도 있습니다, 솔루션을 작성했습니다, 그러나 그것은 나에게 작품! 페이지를로드 할 때 사용되는 입력 토큰 값을 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