【发布时间】:2016-06-05 20:52:57
【问题描述】:
再一次,我遇到了 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 在某处读到,如果我使用“文档”这个词,我可能会遇到一些 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
由于活动可以有很多文档,我使用 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
这个设置,有点工作。如果我“add_item”一堆字段并选择文件,然后全部上传。
对我来说,问题是,当用户按下 add_item,甚至编辑保存的活动时,表单将打开。使用 itens、附加文件按钮和文本:“没有附加文件”。我确信这个文件只是为了告诉用户文件是从(从他自己的计算机)上传的,而不是存储在应用程序上的文件......但这会让用户认为没有文件被上传。
我怎样才能写一个文字说文件在那里,什么时候在那里?
另外,这不是我第一次遇到类似的表单问题。有时,如果对象已经在数据库中,我想显示一些东西。或者如果它是一个新的。 (例如,为现有项目显示“销毁复选框”,但为新项目隐藏)
我该如何做这些事情?
【问题讨论】:
标签: ruby-on-rails paperclip form-for