我有一个表单,提示输入作业和job_files。当作业保存由于验证而失败时,当表单重新显示时,所选的job_files将消失。我如何保留儿童字段?所有父字段都保留在表单中,但子字段已消失。
工作模式:
class Job < ActiveRecord::Base
has_many :job_files, :dependent => :destroy
accepts_nested_attributes_for :job_files, :allow_destroy => true
validates_acceptance_of :disclaimer, :allow_nil => false, :accept => true, :on => :create, :message=>'Must accept Terms of Service'
端
job_files模型:
class JobFile < ActiveRecord::Base
belongs_to :job
has_attached_file :file
end
jobs_controller:
def new
@upload_type = UploadType.find_by_id(params[:upload_job_id])
@job = Job.new
@job.startdate = Time.now
10.times {@job.job_files.build}
@global_settings = GlobalSettings.all
end
def create
@global_settings = GlobalSettings.all
if params[:cancel_button]
redirect_to root_path
else
@job = Job.new(params[:job])
@job.user_id = current_user.id
@upload_type = UploadType.find_by_id(@job.upload_type_id)
if @job.save
JobMailer.job_uploaded_notification(@upload_type,@job).deliver
flash[:notice] = "Job Created"
redirect_to root_path
else
# retain selected files if save fails
(10 - @job.job_files.size).times { @job.job_files.build }
flash[:error] = "Job Creation Failed"
render :action => :new
end
end
end
job_files在工作表单中的部分内容:
<%= form.fields_for :job_files, :html=>{ :multipart => true } do |f| %>
<li class="files_to_upload">
<%= f.file_field :file %>
</li>
<% end %>
任何帮助都会受到赞赏,因为我无法在线找到任何解决方案。
答案 0 :(得分:0)
这是标准问题行为。实际上,解决它的唯一方法是首先保留文件,无论验证是否通过。然后,运行您的验证。但这绝对是一种解决方法。
您还可以在服务器端验证之前进行客户端验证;这样,您可以更好地保证用户的数据在提交到服务器之前是有效的,这样他们就不会遇到任何服务器端验证失败,并且文件将始终存在。如果我在你的鞋子里,我可能会走那条路。请注意,客户端验证不是服务器端验证的替代,在这种情况下只会帮助您的用户。
希望有所帮助!