0

我正在尝试生成类似于 SO 的标记系统。我正在使用 Select2 gem。当用户最初进入新页面时,表单应该只显示他们的标签。在页面上,他们可以通过输入标签名称并用空格或逗号分隔它们来创建新标签。

我的问题是,当我提交此表单时,标签没有正确链接到 ID。我收到错误“找不到 id = 0 的标签”,或者如果我将数字 12 作为标签,“找不到 id = 12 的标签”

一个用户有多个标签;一个帖子有很多标签;一篇文章通过标签有很多标签;一个标签有很多标签;一个标签通过标签有很多帖子;一个标签属于一个用户

如何指定标签 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" }

我的 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
4

1 回答 1

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

在控制器中,我必须将用户密钥合并到表单参数哈希中。

于 2012-11-08T04:17:51.733 回答