2012-03-28 11 views
1

私は、リリースフォームでrails3-jquery-autocomplete gemのアーティストフィールドを使用しています。新しいリリースでは、オートコンプリートで見つかった場合は既存のアーティストのIDを使用するか、見つからない場合は新しいアーティストを作成します。現時点では、オートコンプリート・ジェムは期待通りにアーティストを返しますが、そのアーティストが存在していても新しいエントリを作成します。重複したエントリを避けるためにrails3-jquery-autocompleteを使用しますか?

次のように私のモデルは以下のとおりです。

class Artist < ActiveRecord::Base 
    has_and_belongs_to_many :releases 
end 

class Release < ActiveRecord::Base 
    has_and_belongs_to_many :artists 
    accepts_nested_attributes_for :artists, :reject_if => lambda { |a| a[:name].blank? } 
end 

とコントローラ:

class ArtistsController < ApplicationController 

def index 
    @artists = Artist.find(:all, :order => :name, :group => :name) 
end 

def create 
    @release = Release.find(params[:release_id]) 
    @artist = @release.artists.create(params[:artist]) 
    redirect_to release_path(@release) 
end 

def destroy 
    @release = Release.find(params[:release_id]) 
    @artist = @release.artists.find(params[:id]) 
    @artist.destroy 
    redirect_to release_path(@release) 
end 
end 

class ReleasesController < ApplicationController 
autocomplete :artist, :name 

def new 
    @release = Release.new 
    @release.artists.build 
end 

def create 
    @release = Release.new(params[:release]) 
    @release.user_id = current_user.id 
end 
end 

私のルートが含まれています

resources :releases do 
    get :autocomplete_artist_name, :on => :collection 
end 

そして最後に、アーティストのフィールドを:

<%= f.fields_for :artists do |builder| %> 
<%= render 'artist_fields', :f => builder %> 
<% end %> 

(レンダリングされたフィールド)

<%= f.label :name, "Artist" %><br /> 
<%= f.autocomplete_field :name, autocomplete_artist_name_releases_path, :class => "text" %> 

答えて

0

私はあなたがそれを明確に何が必要ありませんautcomplete associations

にこのrailscastを見てお勧めします。 私はあなたの閲覧を喜びを台無しにしたくないが、それはすべての周りを公転するfind_or_create_by

+0

私はそれを見て、それに従っていましたが、動作させることができませんでした。 – Raoot

+0

入れ子にして保存しています - "find_or_create"を置く場所はどこですか?それを「入れ子にして」ネストしたオブジェクトを別々に保存する必要がありますか? – JosephK

0

は、なぜあなたは のアーティストのIDを取得していない:id_element = f.autocomplete_field上>「#artist_id」? artist_id paramが戻ってこない場合は、それを作成することができます

関連する問題