使这个f.autocomplete_field和这个Tag模型一起工作?

时间:2012-02-27 08:42:39

标签: ruby-on-rails

我有一个Post模型和一个Tag模型(后者有一个名为:name的属性)。 Post模型有一个名为attr_accessor的{​​{1}}我为了制作而添加了:tag_name rails3-jquery-autocomplete插件工作:

post.rb:

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_name

  has_and_belongs_to_many :tags

  def tag!(tags)
    tags = tags.split(" ").map do |tag|
      Tag.find_or_create_by_name(tag)
    end
    self.tags << tags
  end
end

tag.rb:

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

posts_controller.rb:

  def create
    @user = current_user
    @post = @user.posts.new(params[:post])

    if @post.save
      redirect_to @post, notice: 'post was successfully created.'
    else
      render action: "new"
    end

    @post.tag!(params[:tags])
  end

_form.html.erb

<%= f.autocomplete_field :tag_name, autocomplete_tag_name_posts_path, :"data-delimiter" => ' ' %>

使用上面的代码,自动完成工作正常,但是当我提交表单时,我收到此错误:未定义的方法`split'代表nil:NilClass。

我不确定如何处理f.autocomplete_field。之前它曾经像这样完美地提交:

<%= text_field_tag :tags, params[:tags] %>

(我从this教程中获取了这个)

现在,我不知道如何让表单再次成功提交并为帖子创建标签。我不知道我应该在post模型的标签中修改什么!方法和控制器的创建操作。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

create操作中,行 -

@post.tag!(params[:tags])

期待params[:tags]。没有这样的参数,因为你改变了

<%= text_field_tag :tags, params[:tags] %>

<%= f.autocomplete_field :tag_name, autocomplete_tag_name_posts_path, :"data-delimiter" => ' ' %>

,真正持有标签的参数将在 params[:post][:tag_name] 中。这是因为两者生成的html具有文本字段的不同名称属性。在第一种情况下,它是tags,在第二种情况下,它是tag_name

因此将其更改为:

@post.tag!(params[:post][:tag_name])

应该有效