通过Paperclip上传图像而不保存对象

时间:2015-02-11 01:52:46

标签: ruby-on-rails paperclip

我在Rails工作,我有两个模型,一个预启动和一个倡议。基本上我希望用户能够使用预启动的属性创建一个计划。基本上我想要发生的事情是当用户访问他们的预发布并准备将其变成一个计划时,它会将它们带到一个已经填充了预发布信息的表单中,并且他们可以添加其他信息。到目前为止,我已经设法为每个属性执行此操作,除了附加的图像,名为:cover_image。

我认为问题在于我在我的控制器的新动作上设置了关于prelaunch的cover_image的计划的cover_image,但是因为这是新动作而不是创建,所以我还没有保存主动权。我认为这意味着cover_image还没有重新上载,所以@iniative.cover_image.url并没有指向任何东西。它似乎也没有预先填充我的表单的文件字段。

我不完全确定所有这些是多么可行,但这是客户要求的,所以我试图让它适合他们。

这是我的控制器:

def new
  @initiative = Initiative.new
  populate_defaults(@initiative)
  @initiative.build_location
  3.times{ @initiative.rewards.build }
  @initiative.user = current_user
  if !params[:prelaunch_id].nil? && !params[:prelaunch_id].empty?
    # if user is transferring a prelaunch, assign its attributes to the intiative
    @prelaunch = Prelaunch.find(params[:prelaunch_id])
    @initiative.assign_attributes(title: @prelaunch.title,
                                teaser: @prelaunch.teaser,
                                category: @prelaunch.category,
                                funding_goal: @prelaunch.funding_goal,
                                term: @prelaunch.campaign.term,
                                story: @prelaunch.story,
                                location: @prelaunch.campaign.location,
                                video_url: @prelaunch.video_url,
                                EIN: @prelaunch.campaign.EIN,
                                nonprofit: @prelaunch.nonprofit,
                                organization_name: @prelaunch.campaign.organization.name)
  end
end

编辑:

感谢peterept在下面的回答,我已经设法将prelaunch cover_image放入表单并进入计划控制器的创建操作。现在的问题是,一切似乎都在创建动作中完美运行:主动获取预发布的封面图像,它保存没有错误,并重定向到show动作。

UNFORTUNATELY,当它到达控制器的show动作时,@ initiative.cover_image再次设置为默认值。我无法弄清楚成功的创建动作和节目动作之间可能发生的事情。

以下是计划控制器的创建和显示操作:

  def create
    if !params[:initiative][:prelaunch_id].nil? && !params[:initiative][:prelaunch_id].empty?
      @prelaunch = Prelaunch.find(params[:initiative][:prelaunch_id]) # find the prelaunch if it exists
    end
    @initiative = Initiative.new(initiatives_params)
    @initiative.user = current_user
    begin
      @payment_processor.create_account(@initiative)
      if @initiative.save
        # @prelaunch.destroy # destroy the prelaunch now that the user has created an initiative
        flash[:alert] = "Your initiative will not be submitted until you review the initiative and then press 'Go Live' on the initiative page"
        redirect_to initiative_path(@initiative)
      else
        flash[:alert] = "Initiative could not be saved: " + @initiative.errors.messages.to_s
        render :new
      end
    rescue Exception => e
      logger.error e.message
      flash[:error] = "Unable to process request - #{e.message}"
      render :new
    end
  end

  def show
    @initiative = Initiative.find(params[:id])
    @other_initiatives = Initiative.approved.limit(3)
  end

这是来自同一个控制器的initiatives_params方法:

def initiatives_params
  initiative_params = params.require(:initiative).permit(
    :terms_accepted,
    :title,
    :teaser,
    :term,
    :category,
    :funding_goal,
    :funding_type,
    :video_url,
    :story,
    :cover_image,
    :nonprofit,
    :EIN,
    :role,
    :send_receipt,
    :organization_name,
    :crop_x, :crop_y, :crop_h, :crop_w,
    location_attributes: [:address],
    rewards_attributes: [:id, :name, :description, :donation, :arrival_time, :availability, :_destroy, :estimated_value])
  if @prelaunch.media.cover_image
    initiative_params[:cover_image] = @prelaunch.media.cover_image
  end
  initiative_params
end

2 个答案:

答案 0 :(得分:0)

您可以传递图片网址并在页面上显示。

然后,用户可以通过上传新图像来覆盖此图像(按照正常情况)。

在您创建操作时,如果他们没有提供新图片,请将其设置为关联预发布中的图片 - 您要复制原件,以便它不会获得如果他们上传新的,则替换。 (如果您不知道哪个是预启动,则可以将ID传递给页面。)

答案 1 :(得分:0)

我只能通过保存回形针对象来使其工作。这是我的模型:

private Map<String, Class<T>> mapBuilder(String key, T value) {
        Map<String, Class <T>> map = new HashMap<>();
        map.put(key, value);
        return map;
    }

如果我运行以下命令:

class Grade < ActiveRecord::Base
  has_attached_file :certificate
end

它保存/覆盖文件,但不更新@grade.certificate = new_file @grade.certificate.save 对象。

版本:Graderuby-2.3.8Rails 4.2.11.3