我正在尝试生成类似于SO的标记系统。我正在使用Select2 gem。当用户最初转到新页面时,表单应仅显示其标签。在页面上,他们可以通过键入标记名称并用空格或逗号分隔它们来创建新标记。
我的问题是,当我提交此表单时,标签未正确链接到ID。我收到错误“无法找到id = 0的标签”或者如果我将数字12作为标记,“找不到标识为id = 12”
用户has_many标签;一个帖子有很多标签;帖子通过标签有很多标签;标签有很多标签;标签通过标签有很多帖子;标签属于用户
如何指定标记ID名称,只显示标记名称?
我的标签控制器看起来像这样
respond_to :json
def index
@tags = current_user.tags
respond_with(@tags.map{|tag| {:id => tag.id, :name => tag.name, :user_id => tag.user_id} })
end
我的JavaScript看起来像这样
var items = [];
$.getJSON('http://localhost:3000/tags.json', function(data) {
$.each(data, function(i, obj) {
return items.push(obj.name);
});
$("#post_tag_ids").select2({
tags: items,
tokenSeparators: [",", " "]
});
});
我的表单看起来像这样
= semantic_form_for([@user, @post], :html => { :class => 'form-horizontal' }) do |f|
= f.inputs do
= f.input :summary, :label => false, :placeholder => "Title"
= f.input :tag_ids, :as => :string, :label => false, :placeholder => "Tags", input_html: {:id => "post_tag_ids", :cols => 71}
= f.buttons do
.action
= f.commit_button :button_html => { :class => "btn btn-primary" }
My Post Controller看起来有点像这样
def create
@post = Post.new(params[:post])
@post.user = current_user
@post.save
@post.tag!(params[:tag_ids], current_user.id)
end
我的帖子模型有一个标签!方法
def tag!(tags, user)
tags = tags.split(",").map do |tag|
Tag.find_or_create_by_name_and_user_id(tag, user)
end
self.tags << tags
end
答案 0 :(得分:0)
解决这个问题的诀窍是在模型中设置setter方法。我最终使用了这样的东西:
def tag_ids=(tags_string)
self.taggings.destroy_all
tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq
tag_names.each do |tag_name|
tag = Tag.find_or_create_by_name_and_user_id(tag_name, self.user.id)
tagging = self.taggings.new
tagging.tag_id = tag.id
end
end
在控制器中,我必须将用户密钥合并到形式params散列中。