私は、リリースフォームで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" %>
私はそれを見て、それに従っていましたが、動作させることができませんでした。 – Raoot
入れ子にして保存しています - "find_or_create"を置く場所はどこですか?それを「入れ子にして」ネストしたオブジェクトを別々に保存する必要がありますか? – JosephK