Ruby on Rails - входной токен JS, проблема при сбое проверки
У меня есть модель компании, которая может иметь много тегов. Это работает нормально, но в одном случае это не работает. Случай, когда проверка модели компании не удалась. После:render => 'edit' теги в представлении не отображаются. Я подозреваю, что данные предварительно не принимают данные правильно. Я также хотел бы, чтобы теги были сохранены при решении проверок.
Я получил эту идею отсюда: 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="1704"
,
если я изменю код на это:
def tag_tokens
tags.to_json(:only => [:id, :name])
end
новые теги, которые еще не были сохранены в модели компании, удаляются, потому что они читаются из БД каждый раз. Как я могу сохранить введенные данные между переходами формы?
1 ответ
Хорошо, я написал решение, оно может быть не самым хорошим, но оно работает для меня! Он анализирует значение входного токена в формате JSON (при сбое проверки), который используется при загрузке страницы. При загрузке страницы он просто загружает теги из БД.
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