我想用javascript和json标记我的帖子

时间:2012-11-04 14:03:01

标签: javascript ruby-on-rails ruby-on-rails-3 json

我正在尝试生成类似于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

1 个答案:

答案 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散列中。