多くのタグを持つことができる会社モデルがあります。正常に動作しますが、場合によっては動作しません。会社のモデルの検証が失敗する場合があります。:render =>'edit'の後、ビューにタグは表示されません。data-preがデータを正しく取得していないのではないかと思います。また、検証を解決するときにタグを保持したいと思います。
私はここからこのアイデアを得ました:http://railscasts.com/episodes/167-more-on-virtual-attributes
入力トークンコントロールを使用しています:http://loopj.com/jquery-tokeninput/
これは、tag_tokensに関してCompanyモデルにあるものです。
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>
編集:
さて、上記のコードの問題点がわかりました。
編集ページのデータをロードすると、preには次のものが含まれますdata-pre="[{"id":1704,"name":"dump truck"}]"
。検証エラーのあるフォームを送信すると、data-preに次のものが含まれますdata-pre="1704"
。
コードをこれに変更した場合:
def tag_tokens
tags.to_json(:only => [:id, :name])
end
会社モデルにまだ保存されていない新しいタグは、毎回DBから読み取られるため、削除されます。フォームの遷移間で入力したデータを保持するにはどうすればよいですか?