【问题标题】:Uploading images on rails using carrierwave使用载波在轨道上上传图像
【发布时间】:2017-06-15 19:33:02
【问题描述】:

所以我正在开发一个简单的 Rails 分类应用程序。我正在尝试通过 carrierwave 和 minimagick 实现图像上传,它有据可查,我已经在网上学习了许多教程,它们或多或少都为使用 rails 和 SQlite 开发的应用程序。

实现我的代码后,我没有收到任何错误消息或警告,它根本没有上传图像。当我使用 DB Browser for SQlite 查找我的数据库时,所有其他字段都会相应地填写,除了显示为 null 的图像。

我没有将 images 属性作为单独的模型。我希望它们只是我的广告模型的一部分

PS。这是我在 Stackoverflow 上的第一篇文章,所以请多多包涵。除了图片上传之外,其他一切都有效。

new.html.erb

<div class="new_ad_form row">
<div class="col-lg-6 col-lg-offset-3">

 <%= form_for(@ad, :html => { :multipart => true }) do |f|%> 
 <%= render 'layouts/shared/error_messages', object: f.object %>
    <div class= "new_ad_field">
    <%= f.label "title:" %>  <!-- f.object here refers to @ad -->
    <%= f.text_field :title %><br>
    </div>
    <div class= "new_ad_field">
    <%= f.label :category %>
    <%= f.select :category, @categories %><br>
    </div>
    <div class= "new_ad_field">
    <%= f.label :price %>
    <%= f.number_field(:price, in: 1.0..1000000, step: 0.5) %>
    </div>
    <div class= "new_ad_field">
    <%= f.label :description %>
    <%= f.text_area :description, size: "30x5" %>
    </div>
    <div class= "new_ad_field">
    <%= f.label :address %>
    <%= f.text_field :address %><br>
    </div>
    <div class= "new_ad_field">
    <%= f.label :state %>
    <%= f.select :state, @states, {}, :onChange=>"javascript: 
    $dc.select_city();" %>
    </div>
    <div class= "new_ad_field">
    <%= f.label :city %>
    <%= f.select :city, @cities %><br>
    </div>
    <div class="field">
        <%= f.label :images %><br>
        <%= f.file_field :images, :multiple => true %>
    </div>
    <div style="text-align: center"><%= f.submit "Post ad", class: "btn btn-
       large btn-primary" %></div>
 <% end %>
</div>
</div>

ads_controller.rb

class AdsController < ApplicationController
 def new
  #@user = current_user
  @ad = Ad.new
  @categories = ['Electronic equipment', 'Cars', "Clothing", "Phones"]
  @location = {"Abia": ["Abuja","Gusau", "Kaduna", "Kano", "Yola", "Lagos", 
             "Minna", "Keffi"],
             "Zamfara": ["Abuja","Gusau", "Kaduna", "Kano", "Yola", "Lagos", 
             "Minna", "Keffi"]}

  @states = @location.keys
  @cities = @location[@location.keys[0]]

 end

def show
  @user = current_user
  @ads = @user.ads.paginate(page: params[:page])
end

def create

  @ad = current_user.ads.build(ad_params)
  if @ad.save
    flash[:success] = "ad created!"
    redirect_to current_user
  else
    render 'static_pages/home'
  end

private

  def ad_params
    params.require(:ad).permit(:user_id, :title, :category, :description, 
    :price, :address, :city, :state, {images: []})
  end

end

ad.rb

class Ad < ApplicationRecord
belongs_to :user

validates :user_id, presence: true
#validates :images, presence: true

mount_uploader :images, ImagesUploader
serialize :images, JSON
end

images_uploader.rb

class ImagesUploader < CarrierWave::Uploader::Base

 include CarrierWave::MiniMagick

 storage :file

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

   version :thumb do
     process :resize_to_fit => [50, 50]
   end

   def extension_white_list
     %w(jpg jpeg gif png)
   end

end

当然在我的 gemfile 中有

....................
  gem 'carrierwave' 
  gem 'mini_magick'
....................

config/initializers/carrier_wave.rb

require 'carrierwave'
require 'carrierwave/orm/activerecord'

以下是命令行日志。基本上我想弄清楚它为什么要回滚交易。

Started POST "/ads" for 127.0.0.1 at 2017-06-19 14:22:00 -0400
Processing by AdsController#create as HTML
  Parameters: {"utf8"=>"✓", 
"authenticity_token"=>"7ehxs5JEkuhVasFB0m8VQkVbPLEc1+q/xPJQMD1H5Fblw==", 
"ad"=>{"title"=>"sdasdfasdfaasdf", 
"category"=>"Electronic equipment", "price"=>"500", 
"description"=>"asdfasdfasdfwetqwerfasdfasdcvzx", 
"address"=>"asdfafawefasdfadf", "state"=>"Kaduna", "city"=>"Zaria", 
"images"=>[#
<ActionDispatch::Http::UploadedFile:0x0000001041d1a0 @tempfile=#
<Tempfile:C:/Users/SAMSUNG/AppData/Local/Temp/RackMultipart20170619-8456-
1i97f2t.jpg>, 
@original_filename="394502_10152051195495464_1783658057_n.jpg", 
@content_type="image/jpeg", @headers="Content-Disposition: form-data; 
name=\"ad[images][]\"; 
filename=\"394502_10152051195495464_1783658057_n.jpg\"\r\nContent-Type: 
image/jpeg\r\n">]}, "commit"=>"Post ad"}
  User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? 
ORDER BY "users"."id" ASC LIMIT ?  [["id", 24], ["LIMIT", 1]]
   (0.0ms)  begin transaction
   (0.0ms)  rollback transaction
No template found for AdsController#create, rendering head :no_content
Completed 204 No Content in 1706ms (ActiveRecord: 1.0ms)

【问题讨论】:

    标签: ruby-on-rails carrierwave minimagick


    【解决方案1】:

    我认为您需要更改代码中的以下行:

    mount_uploader :images, ImagesUploader

    mount_uploader 应该是这样的复数形式:

    mount_uploaders :images, ImagesUploader

    【讨论】:

      【解决方案2】:

      你需要在config/application.rb文件中添加一些代码

      require 'carrierwave'
      require 'carrierwave/orm/activerecord'
      

      我认为它的工作尝试了这个

      【讨论】:

      • 感谢 Velu,但这并没有解决问题,我的 'config/initializers/carrier_wave.rb' 文件中已经有了这段代码
      猜你喜欢
      • 2015-02-21
      • 2019-07-11
      • 2015-06-08
      • 2012-12-22
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2015-02-08
      • 2023-03-28
      相关资源
      最近更新 更多