使用回形针和 ruby-mp3info 上传和读取文件信息,我有一个创建播放列表及其子轨道的表单:
<%= form_for(@playlist) do |f| %>
<% if @playlist.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@playlist.errors.count, "error") %> prohibited this playlist from being saved:</h2>
<ul>
<% @playlist.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label "Name: " %>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label " Image: " %>
<%= f.file_field :photo %>
</div>
<br>
<div class="field">
<br>
<%= f.text_area :description, :size => "80x3"%>
</div>
<br>
<div class="field">
<%= f.fields_for :tracks, Track.new do |ff| %>
<%= ff.file_field :audio %>
<% end %>
</div>
<% if !@playlist.tracks.blank? %>
<table id="tracks" class="table">
<thead>
<tr>
<th>Track</th>
<th>Album</th>
<th>Artist</th>
<th>Label</th>
</tr>
</thead>
<tbody>
<%= f.fields_for :tracks do |ff| %>
<%= render "track_fields", :f => ff %>
<% end %>
</tbody>
</table>
<% end %>
<div class="actions">
<%= f.submit "Save" %>
</div>
<% end %>
上传文件的问题在于,在我单击“保存”按钮之前我不会拥有它。所以我从我的 Controller 中读取了信息。在我的播放列表 Controller 的更新方法中,我尝试通过以下代码创建一个新轨道:
def update
track = @playlist.tracks.new()
Mp3Info.open(playlist_params["tracks_attributes"]["0"]["audio"].path.to_s) do |info|
track.audio_file_name = info.tag.title
track.artist = info.tag.artist
track.album = info.tag.album
# tracknum = info.tag.tracknum.to_s
end
respond_to do |format|
if @playlist.update(playlist_params)
format.html { redirect_to @playlist, notice: 'Playlist was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @playlist.errors, status: :unprocessable_entity }
end
end
end
问题是当我只想要一个时,我的更新方法中的代码将创建两个轨道实例。如何仅创建从 Controller 中创建的实例并忽略从表单中创建的新轨道?
有没有其他方法可以做到这一点?
最佳答案
您在 tracks
中获得两条记录表,因为您是从 form
创建的(带有 track_attributes)和其他您在 update
中创建的行动。
如果您只需要更新要保存的轨道的一些属性,请在 params[:playlist][:tracks_attributes]
中的轨道上执行此操作.
更改update
操作如下:
def update
Mp3Info.open(playlist_params["tracks_attributes"]["0"]["audio"].path.to_s) do |info|
params[:playlist][:tracks_attributes]["0"][:audio_file_name] = info.tag.title
params[:playlist][:tracks_attributes]["0"][:artist] = info.tag.artist
params[:playlist][:tracks_attributes]["0"][:album] = info.tag.album
# tracknum = info.tag.tracknum.to_s
end
respond_to do |format|
if @playlist.update(playlist_params)
format.html { redirect_to @playlist, notice: 'Playlist was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @playlist.errors, status: :unprocessable_entity }
end
end
end
这将只创建一个关联的
Track
Playlist
的记录在 tracks
table 。
关于audio - 无法正确保存具有 file_field 的嵌套表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264686/