У меня есть модель компании, которая может иметь много тегов. Работает нормально, но в одном случае не работает. Случай, когда проверка модели компании не удалась. После :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>
РЕДАКТИРОВАТЬ:
Итак, я вижу, в чем проблема с приведенным выше кодом.
Когда я загружаю страницу редактирования, data-pre содержит следующее: data-pre="[{"id":1704,"name":"dump truck"}]"
. когда я отправляю форму с ошибкой проверки, предварительные данные содержат: data-pre="1704"
.
если я изменю код на это:
def tag_tokens
tags.to_json(:only => [:id, :name])
end
новые теги, которые еще не были сохранены в модели компании, удаляются, потому что они каждый раз считываются из БД. Как сохранить введенные данные между переходами формы?