【问题标题】:Nested attributes will not save嵌套属性不会保存
【发布时间】:2013-06-09 00:31:58
【问题描述】:

我已经彻底搜索了 stackoverflow 并尝试了所有出现的结果,但我仍然卡住了。这就是问题所在。

我有一个允许我上传音乐文件的应用程序。文件上传后,我扫描 ID3 数据并使用该数据填充数据库中对象的所有各种信息......例如标题、专辑、年份、流派等。

艺术家字段有时有很多艺术家,所以我为这个字段编写了一个方法,它获取所有艺术家并对其进行哈希处理;

{:artist => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}

此数据现在包含在我要保存到数据库的对象中,如下所示;

#<Track id: 76, name: nil, title: "song title", tpath: "file_name.mp3", created_at:      "2013-06-08 23:31:24", updated_at: "2013-06-08 23:31:24", track_number: 6, artist: {:artist   => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}, album_artist: "Artist Name", year: 2012,   genre: "nil", bpm: nil, length: 252, size: 79872, user_id: 2>

在我的tracks_controller(所有动作都发生的地方)我有这个用于我的创建动作;

def create
@track = Track.new(params[:track])
@track.libraries << @library
@track.parse_id3(@track)
@track.update_attributes(@track[:artist]) --># I also tried @track.artist
respond_to do |format|
  if @track.save
    format.html { redirect_to library_track_path(@library, @track), notice: 'Track was successfully created.' }
    format.json { render json: @library_track, status: :created, location: @track }
  else
    format.html { render action: "new" }
    format.json { render json: @track.errors, status: :unprocessable_entity }
  end
end

结束

问题是活动记录没有使用我提供的数据保存/更新我的艺术家(在艺术家表中),但曲目已成功保存到我的数据库中而没有错误。

我在 Artists 和 Tracks 之间设置了以下关系;

class Artist < ActiveRecord::Base
    attr_accessible :age, :birthdate, :first_name, :last_name, :name
    has_many :tracks, :through => :artist_tracks
    has_many :artist_tracks
end

Join Table 的样子;

class ArtistTrack < ActiveRecord::Base
      attr_accessible :album_artist, :artist_id, :track_id
      belongs_to :artist
      belongs_to :track
end

Track 看起来像;

class Track < ActiveRecord::Base
      attr_accessible :name, :title, :tpath, :track_number, :artist, :album_artist,
      :year, :genre, :bpm, :length, :size, :user_id, :artists_attrubutes      

      mount_uploader :tpath, TpathUploader

      belongs_to :user
      has_many :libraries, :through => :track_libraries
      has_many :track_libraries
      has_many :playlists, :through => :playlist_tracks
      has_many :playlist_tracks
      has_many :artists, :through => :artist_tracks
      has_many :artist_tracks

      accepts_nested_attributes_for :artists

end

唯一涉及的表单是具有单个字段的表单,用于询问要上传文件的位置。

我在这里错过了什么?

谢谢。


我得到它的工作,这是需要的。

@track.update_attributes(:artists_attributes => @track.parse_id3(@track))

.parse_id3 是我写的一个方法,它扫描 MP3 的艺术家字段中的所有艺术家并将它们转换成;

:artists_attributes => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}

我试过了;

@track.update_attributes(:artists_attributes)

显然我需要添加 @track.parse_id3(@track) 片段才能使其工作。

感谢所有回复!

【问题讨论】:

  • 我可能错了,但我认为您的嵌套方向不正确。 Artist 可以 accept_nested_attributes_for Track 因为 Track belongs_to Artist。在您的示例中,您试图将Track 链接到尚不存在的Artist。我认为您需要以相反的方式建立关系才能使nested_attributes 起作用
  • 哈希不是嵌套属性所期望的。你是如何构建表单的?
  • 哦,你是从 id3 标签中获取的——我根本不会在这里使用嵌套属性——直接构建艺术家对象
  • 嵌套属性期望什么?也许这就是问题所在。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我认为你的问题是一个错字:

artists_attrubutes

此外,在您的控制器中尝试编写:

@track = Track.new params[:track]
@track.save

要使用它,您应该在视图中组织参数。

【讨论】:

  • 错字是我将复制到 stackoverflow 帖子中的代码修复,它在模型中实际上是正确的。我也尝试了你的建议,但没有奏效。不过感谢您的建议。
【解决方案2】:

我得到它的工作,这是需要的。

@track.update_attributes(:artists_attributes => @track.parse_id3(@track))

.parse_id3是我写的一个方法,它扫描MP3的艺术家字段中的所有艺术家并将它们变成;

:artists_attributes => [{:name=>"Artist 1"},{:name=>"Artist 2"}]}

我试过了;

@track.update_attributes(:artists_attributes)

显然我需要添加 @track.parse_id3(@track) 片段才能使其工作。

感谢所有回复!

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多