Rails 3 fields_for现有记录/新记录的不同布局,文件上传

时间:2011-01-09 14:29:35

标签: forms file-upload ruby-on-rails-3 nested-forms

我有一个内容模型,其中包含一个或多个音频文件,需要通过新/编辑表单添加。 我所做的是用这种关系创建模型:

class Audio < ActiveRecord::Base
  belongs_to :content
  has_attached_file :audiofile,
end

class Content < ActiveRecord::Base
  ...
  has_many :audios
  accepts_nested_attributes_for :audios, :allow_destroy => true
end

现在,在我的新内容表单中,我有以下内容:

<% f.fields_for :audios do |audiof| -%>

  <%= f.label :audiofile, 'Audio file:' %>&nbsp;
  <%= audiof.file_field :audiofile %>

<% end -%>

我需要它做的是向我展示file_field仅用于新的音频文件,对于现有的文件,只需打印一个文件大小,名称和可能的删除按钮。

我还在控制器中创建了一条新记录:

@content.audios.build

我正在使用Rails 3.0.3和Paperclip插件进行上传。对不起,如果问题太苛刻了。

感谢。

1 个答案:

答案 0 :(得分:0)

从我的记忆中,你将能够在fields_for语句中访问该对象的实例。

尝试类似的东西:

<% f.fields_for :audios do |audiof| -%>
  <% if audiof.object.new_record? %>
    <%= f.label :audiofile, 'Audio file:' %>&nbsp;
    <%= audiof.file_field :audiofile %>
  <% else %>
    <%= "Filename = #{audiof.object.audiofile.filename}" %>
    <%= "url = #{audiof.object.audiofile.url}" %>
  <% end %>
<% end -%>

如果audiof.object返回nil(在这种情况下,它不是好名字),请通过显示所有公共方法<% = raise audiof.public_methods.inspect %>

进行检查

object方法应返回Audio类的实例。