0

私はRyan BateのRailscast on Token Inputをフォローしました.

 <%= f.text_field :artist_tokens, "data-pre" => @release.artists.map(&:attributes).to_json, :class => "text" %

リリースの下に「トラック」があり、トラック レベルでアーティストを修正および変更できるようにしたいと考えています。上記を使用して、リリース レベルのアーティストを「継承」することができます。これは、新しい方法と初期設定では問題なく機能するようですが、編集時に明らかにリリース レベルのアーティストが引き戻され、サブミットされた場合、すべてのトラックがヒットします。レベルのアーティストは上書きされます。

私はこれをやろうとしています:

<% if params[:action] == "edit" %>
<%= f.text_field :artist_tokens, "data-pre" => @track.artists.map(&:attributes).to_json, :class => "text" %>
<% else %>
<%= f.text_field :artist_tokens, "data-pre" => @release.artists.map(&:attributes).to_json, :class => "track_artist_tokens" %>
<% end %>

しかし、@ track.artists.mapで未定義のメソッド「アーティスト」を取得しています

私のモデルは次のとおりです。

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

  attr_reader :artist_tokens

    def artist_tokens=(ids)
      self.artist_ids = ids.split(",")
    end

  has_many :releases_tracks, :dependent => :destroy
  has_many :tracks, :through => :releases_tracks

  accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true

  has_many :artists_tracks

end

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



   class Track < ActiveRecord::Base
      has_many :releases_tracks, :dependent => :destroy
      has_many :releases, :through => :releases_tracks

      has_many :artists_tracks
      has_many :artists, :through => :artists_tracks

      attr_reader :artist_tokens
      def artist_tokens=(ids)
        self.artist_ids = ids.split(",")
      end

    end

class ArtistsTrack < ActiveRecord::Base
  belongs_to :artist
  belongs_to :release
  belongs_to :track
end

class ReleasesTrack < ActiveRecord::Base
  belongs_to :release
  belongs_to :track
  acts_as_list
end

誰でも助けることができますか?

更新:

リリース コントローラー トラック メソッド:

def tracks
     @release = Release.find(params[:id])
     @track = @release.tracks.find(:all)
        respond_to do |format|
        format.html # tracks.html.erb
        end
  end

track.html.erb には次のものがあります。

    <%= form_for @release do |f| %>
            <%= f.fields_for :tracks do |builder| %>
            <%= render 'track_fields', :f => builder %>
            <% end %>
<% end %>

_track_fields.html.erb 部分 (わかりやすくするために一部の HTML を削除しています)

<td class="label">Title:</td>
<td class="field"><%= f.text_field :name, :class => "text" %></td>

<td class="label">Artists:</td>
<td class="field">
    <% @track.each do |track| %>
    <%= f.text_field :artist_tokens, "data-pre" => track.artists.map(&:attributes).to_json, :class => "track_artist_tokens" %>
    <% end %>

<p><%= link_to 'Add new artist', new_artist_path, :remote => true %></p>

<td class="label">Version:</td>
<td class="field"><%= f.text_field :version, :class => "text" %></td>

<td class="label">ISRC:</td>
<td class="field"><%= f.text_field :isrc, :class => "text" %></td>

<td class="label">Remove:</td>
<td class="field"><%= f.check_box :_destroy %></td>
4

1 に答える 1

1

あなたのshowアクション@trackには1つのtrackオブジェクトがあります。アクションでは、オブジェクトcustomerのコレクションです。trackしたがって、それらをループする必要があります。

<% @track.each do |track| %>
  <%= f.text_field :artist_tokens, "data-pre" => track.artists.map(&:attributes).to_json, :class => "text" %>
<% end %>

またはtrack、コレクションの最初のものを取得します。

<%= f.text_field :artist_tokens, "data-pre" => @track.first.artists.map(&:attributes).to_json, :class => "text" %>
于 2012-05-01T09:49:49.940 に答える