加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在ActiveRecord Create上验证Carrierwave文件

发布时间:2020-12-17 02:03:38 所属栏目:百科 来源:网络整理
导读:所以我有一个非常直接的Carrierwave实现图像上传.我已经在ActiveRecord模型上安装了上传器: class MenuItem ActiveRecord::Base attr_accessible :description,:menu_id,:name,:active,:photo mount_uploader :photo,PhotoUploader belongs_to :menu before
所以我有一个非常直接的Carrierwave实现图像上传.我已经在ActiveRecord模型上安装了上传器:

class MenuItem < ActiveRecord::Base
    attr_accessible :description,:menu_id,:name,:active,:photo

    mount_uploader :photo,PhotoUploader

    belongs_to :menu

    before_save :default_values

    validates :name,presence: true
    validates :menu_id,presence: true
    validates :description,length: { maximum: 250 }

    private
       def default_values
         if (self.active.nil?)
           self.active = true
         end
       end  
end

我正在使用的表单结合编辑/创建上面的MenuItem以及附加文件:

<%= form_for(@menuitem) do |f| %>
        <%= render 'shared/error_messages',object: @menuitem %>

        <%= f.file_field :photo,:id => "photo" %>

        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :description %>
        <%= f.text_area :description %>

        <%= f.label :active %>
        <%= f.check_box :active,:value => @menuitem.active %>

        <%= f.submit "Save Menu Item",class: "btn btn-large btn-primary" %>
        <%= f.submit "Cancel",class: "btn btn-large btn-secondary" %>
    <% end %>

在编辑/更新的情况下,一切正常.

但是,在New / Create上我收到了一个验证错误:photo属性只是说“Photo is Invalid”.上传者定义是vanilla:

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  after :store,:make_thumbnail

  storage :fog

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def make_thumbnail(file)
    a = filename.split('/')
    key = store_dir + "/" + a[0] + "/" + model.id.to_s + "_thumb.jpg"

    job = Blitline::Job.new(url)
    job.application_id = ENV['BLITLINE_APPLICATION_ID']

    sf = job.add_function("resize_to_fill",{:height => 100,:width => 100})
    sf.add_save("thumbnail",key,ENV['S3_BUCKET'])

    bs = Blitline.new
    bs.jobs << job   
    res = bs.post_jobs
  end
end

Controller方法也很简单

class MenuItemsController < ApplicationController
  def new
    @menuitem = MenuItem.new
    @menuitem.menu_id = params[:menuid]
    @menuitem.active = true
  end

  def create
    @menuitem = MenuItem.new(params[:menu_item])

    if @menuitem.save
        flash[:success] = "Menu Item created!"
        redirect_to menu_path(@menuitem.menu)
    else
        render 'new'
    end    
end

我想也许问题可能与上传者的store_dir方法中对model.id的引用有关,而且由于尚未创建记录,因此ID无法使用 – 但删除它并没有帮助解决问题.

同样,使用相同表单的编辑/更新路径只需调用menuitem.update_attributes(params [:menu_item])就可以正常工作.

我确信有一些显而易见的东西我不见了.任何建议将不胜感激!

解决方法

您可以通过将carrierwave.rb初始化程序文件中的 – ur_net_format验证设置为false来修复错误.

像这样:

ruby
    config.validate_unique_filename = true
    config.validate_filename_format = true
    config.validate_remote_net_url_format = true

希望这有助于任何人.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读