2012-02-27 11 views
0

私はPostモデルとTagモデルを持っています(後で:nameという属性があります)。 Postモデルは、私が rails3-jquery-autocompleteプラグインを動作させるために添加:tag_nameと呼ばれるattr_accessorがありますこの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:自動補完上記のコードでは_form.html.erb

<%= f.autocomplete_field :tag_name, autocomplete_tag_name_posts_path, :"data-delimiter" => ' ' %> 
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 

が働いているが、私はフォームを送信するとき、私はこのエラーが出る:未定義のメソッドが `nilのために「スプリット: NilClass。

f.autocomplete_fieldとどうすればよいか分かりません。それはこのように完全に提出するために使用する前に:

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

を(私はthisチュートリアルからこれを取った)

今、私は、フォームが正常に再提出するようにする方法を知っていると投稿用のタグを作成しないでください。ポストモデルのタグで何を修正すればい​​いのか分かりません!方法およびコントローラは、アクションを作成します。

提案がありますか? createアクション、ラインで

答えて

1

-

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

params[:tags]を期待しています。あなたは

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

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

を変更すると、実際にタグを保持しているのparamsは、params[:post][:tag_name]になりますので、そのようなparamがありません。これは、2つの要素によって生成されたhtmlがテキストフィールドの名前属性が異なるためです。最初のケースではtagsであり、2番目のケースではtag_nameです。

だからそれを変える:

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

+0

おかげで多くのことを動作するはずです!私はいつもこのような属性を置くことが何を意味するのか疑問に思っていました: 'params [:first_attribute] [:second_attribute]'それは何ですか(申し訳ありません、私は初心者です)? – alexchenco

+0

アレックスにようこそ。railsコントローラ内には、フォームまたはurlを介して送信されたパラメータを含む 'params'ハッシュがあります。フォームでは、入力要素の 'name'属性がparamsハッシュのキーを構成し、入力されたデータは対応する値になります。パラメータがURLで渡された場合(?x = 23を使用)、それらもparamsハッシュの一部になります。 – abhishek

関連する問題