0

我正在尝试设置一个上传图片页面,用户可以在其中选择上传图片网址。我正在使用carrierwave 视图:

<%= form_for @rating, :html => {:multipart => true} do |f| %>

    <p>
      <%= f.file_field :pic_url %>
    </p>

    <p>
      <%= f.label :remote_pic_url_url, 'or image url' %>
      <br/>
      <%= f.text_field :remote_pic_url_url %>
    </p>

    <div class="actions">
      <%= f.submit 'Upload Picture', :class => 'btn btn-primary' %>
    </div>

该模型:

class Rating < ActiveRecord::Base
  attr_accessible :pic_url, :remote_pic_url_url, :rating

  mount_uploader :pic_url , ImageUploader
end

当我尝试仅输入图像 url 时,我收到一条错误消息: Pic url You are not allowed to upload "" files, allowed types: jpg, jpeg, gif, png

如何使该字段可选。我的印象remote_{columnName}_url是在carrierwave中添加额外的url字段的约定,这将为我解决这个问题..

控制器代码:

# POST /ratings
  # POST /ratings.json
  def create
    @rating = Rating.new(params[:rating])

    respond_to do |format|
      if @rating.save
        format.html { redirect_to @rating, :notice => 'Rating was successfully created.' }
        format.json { render :json => @rating, :status => :created, :location => @rating }
      else
        format.html { render :action => "new" }
        format.json { render :json => @rating.errors, :status => :unprocessable_entity }
      end
    end
  end
4

1 回答 1

1

看到这个线程

您遇到的错误 ( You are not allowed to upload "" files, allowed types: jpg, jpeg, gif, png) 与您在以下情况下遇到的错误相同:

@rating.remote_pic_url_url = "http://www.google.com"
@rating.save

这里的问题是 Carrierwave 打开 URL,然后使用 调用生成的文件base_uri.path,它返回/,因此出现错误。如果您输入的 URL 没有扩展名,那么这就是原因。

如果没有,那么我不确定为什么它不起作用。我在自己的项目中使用相同的方法(即设置remote_{columnname}_url然后保存记录)并且效果很好。虽然我通常不使用扩展白名单验证器,但我添加了一个并且(至少在控制台中)它与有效的 URL(即指向具有有效扩展名的图像的 URL)也可以正常工作。

您可以在控制台中尝试以下步骤,看看它是否正确保存?(在 JPG/GIF/PNG 文件中插入一些有效的 URL):

@rating = Rating.new(remote_pic_url_url: 'http://...')
@rating.save
于 2012-11-30T00:15:11.243 回答