Rails,form_for和paperclip

时间:2016-06-05 20:52:57

标签: ruby-on-rails paperclip form-for

再一次,我遇到了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;对于现有项目,但隐藏新项目)

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以检查文件是否存在。例如,您可以检查db中是否设置了file_name属性,例如acdoc.document?,或者您可以检查文件系统上是否确实存在该文件,如下所示:acdoc.document.exists?

  • show_destroy_checkbox if acdoc.document?
  • show_destroy_checkobx if acdoc.document.exists?

干杯!