我有一个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模型的标签中修改什么!方法和控制器的创建操作。
有什么建议吗?
答案 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])
应该有效