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

标签 audio ruby-on-rails-4

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

相关文章:

ruby-on-rails - 多个要求并允许强参数 rails 4

javascript - Rails 评论不使用 ajax 呈现

javascript - 如何在 ruby​​-rails View 模板中表示数组?

python - 解包单 channel 波形数据并将其存储在数组中

c# - NAudio MeteringSampleProvider 没有触发事件?

javascript - 使用 createAudioPlayer 播放音频时出错

c# - 在 C#.Net 中播放 MIDI 文件时听不到声音

ruby-on-rails - 在 Angular 脚本中重用 Rails 部分?

ruby-on-rails - rake 数据库 :migrate fails in db:structure:dump with no error output

ruby-on-rails - 如何在heroku服务器上安装red5