我有一个可以有很多标签的公司模型。它工作正常,但有一次它不起作用。情况是公司模型验证失败。在 :render => 'edit' 之后,它不会在视图中显示标签。我怀疑 data-pre 没有正确获取数据。我还希望在解决验证时保留标签。
我从这里得到了这个想法: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>
编辑:
好的,所以我看到上面的代码有什么问题。
当我加载编辑页面数据-pre 包含这个:data-pre="[{"id":1704,"name":"dump truck"}]"
。当我提交带有验证错误的表单时,data-pre 包含:data-pre="1704"
.
如果我将代码更改为:
def tag_tokens
tags.to_json(:only => [:id, :name])
end
尚未保存到公司模型的新标签将被删除,因为它们每次都从数据库中读取。如何在表单转换之间保留输入的数据?