gpt4 book ai didi

audio - 无法正确保存具有 file_field 的嵌套表单

转载 作者:行者123 更新时间:2023-12-03 02:12:02 25 4
gpt4 key购买 nike

使用回形针和 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com