背景:我现在已经做了大约一年的RoR,并且对它很熟悉,但是,我对Javascript几乎一无所知。
我一直在玩我的rails应用程序中的一些jquery自动填充功能。我几乎有一个版本正在运行,但是对于一对多的关系也需要一些标记化的字段。
正确的提示 - 好老Ryan Bates在上面railscast。所以我开始按照说明进行操作。
当我不得不开始安装'jquery-rails'宝石时,我有点紧张(我已经安装了jrails来让其他东西工作)。
如所怀疑的那样,它破坏了一些东西,但我设法让它再次起作用。
无论如何,我完成了教程的大部分内容,一切都很顺利 - 我已经有了tokenizer脚本来找到正确的输入字段,并且它按预期运行。我也测试了json链接 - 它发送回所有正确的东西。
然而,当我开始输入文本字段时 - 没有任何反应,当我查看控制台窗口时,它会返回:
Uncaught TypeError: Cannot call method 'replace' of undefined
jQuery.jQuery.extend._Deferred.deferred.resolveWith
done
jQuery.ajaxTransport.send.callback
我可以猜测为什么会出错 - 但任何专家建议都会受到高度赞赏。
(我还应该补充 - 我也使用了formtastic)
提前致谢。
答案 0 :(得分:0)
好的,终于明白了。
事实证明,我的作者姓名列不是name
,而是author
。因此,我需要在js.coffee
脚本中进行更改,以覆盖name
的默认搜索。
您需要使用的行是:
propertyToSearch: "author"
我的整本book.js.coffee文件现在看起来像这样:
jQuery ->
$('#book_author_tokens').tokenInput '/authors.json'
theme: 'mac'
prePopulate: $('#book_author_tokens').data('load')
propertyToSearch: "author"
这实际上修复了错误Uncaught TypeError: Cannot call method 'replace' of undefined
当然,如果你使用不同的列名,你还需要编辑author.rb文件中的函数来反映:
def self.tokens(query)
authors = where("author like ?", "%#{query}%")
if authors.empty?
[{id: "<<<#{query}>>>", author: "New: \"#{query}\""}]
else
authors
end
end
def self.ids_from_tokens(tokens)
tokens.gsub!(/<<<(.+?)>>>/) { create!(author: $1).id }
tokens.split(',')
end
修改强>
我必须为这个领域做的另一件事是预先填充现有的作者,这改变了这个:
= f.input :author_tokens, :data => { :load => @book.author }
对此:
= f.input :author_tokens, :input_html => { :data => { :load => @book.author } }
然后他们会出现。
希望这会对你有所帮助。