【问题标题】:Rails, form_for and paperclipRails、form_for 和回形针
【发布时间】: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


    【解决方案1】:

    您可以检查文件是否存在。例如,您可以检查您的数据库中是否设置了 file_name 属性,例如 acdoc.document?,或者您可以检查文件是否确实存在于文件系统中,例如:acdoc.document.exists?

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

    干杯!

    【讨论】:

    • 问题是,我在 form_for 中。因此,我在其中的文档对象是正确的对象。它是一个表单生成器助手:未定义的方法“存在吗?”对于 <:helpers::formbuilder:0x000000032b9d70>
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2012-11-17
    • 2015-11-14
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多