0

我有一个表单,提示输入作业和要附加的 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

工作控制器:

  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 %>

任何帮助将不胜感激,因为我在网上找不到任何解决方案。

4

1 回答 1

0

这是标准问题行为。确实,解决此问题的唯一方法是首先保留文件,无论验证是否通过。然后,运行您的验证。但这绝对是一种解决方法。

您还可以在服务器端验证之前进行客户端验证;这样,您可以更好地保证用户的数据在提交到服务器之前是有效的,这样他们就不会遇到任何服务器端验证失败,并且文件总是会成功。如果我在你的鞋子里,我可能会走那条路。请注意,客户端验证不能替代服务器端验证,在这种情况下只会帮助您的用户。

希望有帮助!

于 2013-07-02T15:58:07.920 回答