Ruby on Rails - JS 输入令牌,验证失败时的问题

Posted

技术标签:

【中文标题】Ruby on Rails - JS 输入令牌,验证失败时的问题【英文标题】:Ruby on Rails - JS Input token, an issue when validation fails 【发布时间】:2012-11-19 13:11:44 【问题描述】:

我有一个可以有很多标签的公司模型。它工作正常,但有一次它不起作用。情况是公司模型验证失败。在 :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="[&amp;quot;id&amp;quot;:1704,&amp;quot;name&amp;quot;:&amp;quot;dump truck&amp;quot;]"。当我提交带有验证错误的表单时,data-pre 包含: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

【讨论】:

以上是关于Ruby on Rails - JS 输入令牌,验证失败时的问题的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails:Google API dailyLimitExceededUnreg

Angular.js 与 Ruby On Rails 表单的集成

配置 Ruby on Rails 以生成 .js 而不是 js.coffee [重复]

Ruby on Rails - 如何在 application.js 中执行 require

Ruby on Rails,json vs js ajax 响应

ruby on rails 中的 Coffeescript 编译错误