1

Auto-Complete Association Railscast に従って、「アーティスト」を「リリース」に追加しました。すべてがうまく機能しているように見えましたが、オートコンプリートで選択した場合に既存のアーティストを使用するのではなく、毎回新しいアーティストを作成していることに気付きました.

Railscast とは異なり、私は多対多の関係を使用しており、アーティストはリリースの下でネストされた属性としても受け入れられるため、問題はおそらくそれらのいずれかまたは両方に関連していることを認識しています。

以下は私のモデルと関連するビューです。回線self.artist = Artist.find_or_create_by_name(name) if name.present?は使用されていないようです。f.autocomplete_field :nameこれは代わりに持っているためだと思いましたf.autocomplete_field :artist_nameが、それに変更するとメソッドエラーが発生しません!

誰でも助けてもらえますか?

class Release < ActiveRecord::Base
  has_many :artist_releases
  has_many :artists, :through => :artist_releases

  accepts_nested_attributes_for :artists, :reject_if => lambda { |a| a[:name].blank? }
  accepts_nested_attributes_for :artist_releases

  def artist_name
   artist.try(:name)
  end

  def artist_name=(name)
   self.artist = Artist.find_or_create_by_name(name) if name.present?
  end      
end

class ArtistRelease < ActiveRecord::Base
  belongs_to :artist
  belongs_to :release
end

class Artist < ActiveRecord::Base
  has_many :artist_releases
  has_many :releases, :through => :artist_releases  
end


#Release Form
<%= form_for(@release) do |f| %>
<%= f.text_field :title, :class => "text" %>
    <%= f.fields_for :artists do |builder| %>
    <%= render 'artist_fields', :f => builder %>
    <% end %>
    <p><%= link_to_add_fields "Add Artist", f, :artists %> </p>
<% end %>

#Artist Fields
<p>
<%= f.label :artist_name, "Artist" %><br />
<%= f.autocomplete_field :name, autocomplete_artist_name_releases_path, :id_element => '#artist_id', :class => "text" %>
</p>
4

1 に答える 1

0

あなたはどちらかを置くべきです

<%= f.autocomplete_field :artist_name, autocomplete_artist_name_releases_path, :class => "text" %>

ここで、f はリリース フォームです。ただし、これは Release#artist (1 つだけ) に割り当てられます。これは未定義である必要があります。これは、リリース モデルのためです。has_many :artists

あなたができることは、カンマ区切りのリストで多くの名前を許可することです。これをリリース形式で直接配置することに注意してください。ネストされた属性は必要ありません。

#Release Form
<%= form_for(@release) do |f| %>
<%= f.text_field :title, :class => "text" %>
...
<%= f.autocomplete_field :artist_names, autocomplete_artist_name_releases_path, :class => "text", 'data-delimiter' => ',' %>
<% end %>

リリース モデルでは、ネストされた属性は必要ありません。

class Release < ActiveRecord::Base
  has_many :artist_releases
  has_many :artists, :through => :artist_releases

  attr_accessor :artist_names 
  def artist_names=(names)
    self.artists = names.split(',').map { |name| Artist.find_or_create_by_name(name.strip) }
  end 
end

ネストされた属性で解決できますが、アーティストが入力するフィールドが複数ある場合にのみお勧めします。

于 2012-05-30T10:18:55.767 に答える