再一次,我遇到了form_for的问题。
我有一个活动模型,它看起来像:
class Activity < ActiveRecord::Base
has_many :acdocs, dependent: :destroy, autosave: true
accepts_nested_attributes_for :acdocs,
reject_if: proc { |attributes| attributes['descr'].blank?},
allow_destroy: true
end
我有一个acdoc模型。 acdoc是活动文件的缩写。 o如果我使用了&#34;文件&#34;我可能会遇到一些JavaScript问题......那么最好的安全而不是抱歉。
class Acdoc < ActiveRecord::Base
belongs_to :activity
has_attached_file :document
validates_attachment :document,
:presence => true,
content_type: { content_type: ["image/jpeg", "image/gif", "image/png", "application/pdf"] }
end
由于活动可以包含许多acdoc,我使用form_for来处理:
<%= f.fields_for :acdocs do |acdocs| %>
<div>
<%= acdocs.label :descr" %>
<%= acdocs.text_field :descr %>
<%= acdocs.label :document %>
<%= acdocs.file_field :document b%>
</div>
<% end %>
<p>
<%= f.submit 'add doc', :name => "add_item" %>
</p>
<div class="actions">
<%= f.submit %>
</div>
对于控制器,我使用它:
def new
@activity = Activity.new
@activity.acdocs.build
end
def create
@activity = Activity.new(activity_params)
if params[:add_item]
@activity.acdocs.build
render :action => 'new'
else
respond_to do |format|
if @activity.save
format.html { redirect_to @activity, notice: 'Activity was successfully created.' }
format.json { render action: 'show', status: :created, location: @activity }
else
format.html { render action: 'new' }
format.json { render json: @activity.errors, status: :unprocessable_entity }
end
end
end
end
def update
if params[:add_item]
unless params[:activity][:acdocs_attributes].blank?
for attribute in params[:activity][:acdocs_attributes].permit!
@activity.acdocs.build(attribute.last.except(:_destroy)) unless attribute.last.has_key?(:id)
end
end
@activity.acdocs.build
render :action => 'edit'
else
respond_to do |format|
if @activity.update(activity_params)
format.html { redirect_to @activity, notice: 'Activity was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @activity.errors, status: :unprocessable_entity }
end
end
end
end
这个设置,有点工作。如果我&#34; add_item&#34;一堆字段并选择文件,然后全部上传。
对我来说,问题是,当用户按下add_item,甚至编辑已保存的活动时,表单将会打开。使用itens,附加文件按钮和文本:&#34;没有附加文件&#34;。我确信这个文件只是告诉用户文件是从(从他自己的计算机)上传而不是存储在应用程序上的文件...但这会让用户认为没有上传文件。 / p>
我怎么能把文件说文件在那里,什么时候存在?
此外,这不是我第一次遇到与形式类似的问题。有时,如果对象已经存在于数据库中,我想显示一些内容。或者如果是新的。 (例如,显示&#34;销毁复选框&#34;对于现有项目,但隐藏新项目)
我该怎么办?
答案 0 :(得分:0)
您可以检查文件是否存在。例如,您可以检查db中是否设置了file_name属性,例如acdoc.document?
,或者您可以检查文件系统上是否确实存在该文件,如下所示:acdoc.document.exists?
show_destroy_checkbox if acdoc.document?
或show_destroy_checkobx if acdoc.document.exists?
干杯!