2012-02-27 45 views
0

我有一个Post模型和一个Tag模型(后者有一个属性叫做:name)。 post模型有一个名为attr_accessor:tag_name我为了加入使 rails3-jquery-autocomplete插件工作:使这个f.autocomplete_field和这个标签模型一起工作?

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" => ' ' %> 

随着自动完成上面的代码工作,但是当我提交表单我得到这个错误:未定义的方法`分裂”的零: NilClass。我不确定如何处理f.autocomplete_field。之前它曾经完美提交这样的:

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

(我把这个从this教程)

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

有什么建议吗?

回答

1

create动作,线路 -

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

期待params[:tags]。有没有这样的PARAM因为当你改变

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

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

,那真的是抱着标签PARAMS将在params[:post][:tag_name]。这是因为两者产生的html具有不同的文本字段的名称属性。第一种情况是tags,第二种情况是tag_name

所以将其更改为:

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

应该工作

+0

非常感谢!我总是想知道这意味着什么:'params [:first_attribute] [:second_attribute]'它做了什么(抱歉,我是Rails初学者)? – alexchenco 2012-02-27 10:33:31

+0

欢迎Alex。在rails控制器中,有一个'params'散列,其中包含通过表单或通过url提交的参数。在形式中,输入元素的'name'属性构成params散列的键,并且输入的数据变成对应的值。如果参数在URL中传递(使用?x = 23),它们也会成为params散列的一部分。 – abhishek 2012-02-27 10:47:12

相关问题