【问题标题】:Rails Carrierwave Multiple Images Not PostingRails Carrierwave 多张图片未发布
【发布时间】:2017-07-10 08:10:45
【问题描述】:

我正在按照 Rails 教程松散地在 Rails 中开展一个小项目。我让 Carrierwave、Fog 和 AWS 在上传单个图像的生产中工作得非常出色。我想添加一个图片库,所以我想我会在链接中关注 SSR 的答案:Rails 4 multiple image or file upload using carrierwave

我的模型似乎一切正常,测试甚至通过了,但是当我去创建或编辑列表时,上传器似乎不起作用。它会挂起几分钟而不解决(即使文件大小很小),并且控制台不会读取提交时发布的操作(对于表单本身的最后一个 GET 仅读取 200)。除了命名约定(我使用 Listing 作为 Post 模型,使用 listing_gallery 而不是 post_attachment),这些步骤是相同的​​。 Rails 5 对 Carrierwave 有什么改变吗?

listing.rb

class Listing < ApplicationRecord
VALID_PHONE_REGEX = /(\(*(\d{3})\)|(\d{3}-)|(\d{3}))\s*(\d{3})-*(\d{4})/
VALID_ZIP_REGEX = /\d{5}((-)?\d{4})?/

# One use has many listings
belongs_to :user

# Listing_gallery
has_many :listing_galleries
accepts_nested_attributes_for :listing_galleries

# Descending order from newest to oldest as default
default_scope -> { order(created_at: :desc) }

# Carrier Wave mount uploader for images
mount_uploader :picture, PictureUploader
mount_uploader :image, PictureUploader

# Validation of parameters before accepting listing
validates :user_id, presence: true
validates :description, presence: true
validates :street_address, presence: true
validates :city, presence: true, length: { maximum: 30 }
validates :zip_code, presence: true, length: {minimum: 5, maximum: 10}, format: { with: VALID_ZIP_REGEX }
validates :primary_contact, presence: true, length: {minimum: 10, maximum: 15}, format: { with: VALID_PHONE_REGEX }


end

listings_controller.rb

class ListingsController < ApplicationController
before_action :logged_in_user, only: [:new, :create, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update, :destroy]

def new
    @listing = Listing.new
    @listing_gallery = @listing.listing_galleries.build
end

def create
    if current_user.admin?
        @listing = current_user.listings.build(listing_params)
        @listing.listing_status = "active"

        respond_to do |format|
            if@listing.save!
                params[:listing_galleries]['image'].each do |image|
                    @listing_gallery = @listing.listing_galleries.create!(:image => image)
                end

                flash[:success] = "New Listing created!"
                redirect_to root_url
            else
                render 'new'
            end
        end
    else
        flash[:failure] = "You must be an admin to create a listing."
        redirect_to root_url
    end
end

def show
  @listing = Listing.find(params[:id])
  @listing_galleries = @listing.listing_galleries.all
end

def edit
    if current_user.admin?
        @listing = Listing.find(params[:id])
        render 'edit'
    end
end

def update
    if current_user.admin?
        @listing = Listing.find(params[:id])

        respond_to do |format|
            if @listing.update_attributes(listing_params)
                if params[:listing_galleries] != []
                    params[:listing_galleries]['image'].each do |image|
                        @listing_gallery = @listing.listing_galleries.create!(:image => image)
                    end
                end

                flash[:success] = "Listing Updated!"
                redirect_to @listing
            else
                render 'edit'
            end
        end
    end
end

def destroy
    if current_user.admin?
        @listing.listing_status = "deleted"

        if @listing.save!
            flash[:success] = "Listing DELETED"
            redirect_to request.referrer || root_url
        else
            flash[:failure] = "Could not remove listing"
            redirect_to request.referrer || root_url
        end
    end
end

private

# Check for necessary paramters
def listing_params
    params.require(:listing).permit(:description, :street_address, :city, :state,
                                    :zip_code, :primary_contact, :secondary_contact,
                                    :listing_status, :asking_price, :renobb, :picture,
                                    { image: [] },
                                    listing_galleries_attributes: [:id, :listing_id, :image, :_destroy])
end

# Ensure only the creator of the listing is destroying it
def correct_user
    @listing = current_user.listings.find_by(id: params[:id])

    if current_user.admin?
        return true
    end

    redirect_to root_url if @listing.nil?
end

end

listings/new.html.erb

<% provide(:title, 'Create Listing') %>

<div id="content">

<div id="sectionbanner">
    <p class="goldtext">
        Create a New Listing
    </p>
</div>

<!-- Article -->
<div id="article">

    <div class="form">
        <%= form_for(@listing, html: { multipart: true}) do |form| %>
            <%= render 'shared/error_messages_listings' %>

            <%= form.label :street_address %>
            <br>
            <%= form.text_field :street_address, class: 'form-control' %>

            <br>
            <%= form.label :city %>
            <br>
            <%= form.text_field :city, class: 'form-control' %>

            <br>
            <%= form.label :state %>
            <br>
            <%= form.text_field :state, class: 'form-control' %>

            <br>
            <%= form.label :zip_code %>
            <br>
            <%= form.text_field :zip_code, class: 'form-control' %>

            <br>
            <%= form.label :primary_contact %>
            <br>
            <%= form.text_field :primary_contact, class: 'form-control' %>

            <br>
            <%= form.label :secondary_contact %>
            <br>
            <%= form.text_field :secondary_contact, class: 'form-control' %>

            <br>
            <%= form.label :asking_price %>
            <br>
            <%= form.number_field :asking_price, class: 'form-control' %>

            <br>
            <%= form.label :description %>
            <br>
            <%= form.text_area :description, placeholder: "Details of the lot, rules, etc..." %>

            <br>
            <%= form.label :renobb %>
            <br>
            <%= form.check_box :renobb %>

            <br>
            <span class="picture">
                <%= form.file_field :picture, accept: 'image/jpeg, image/gif, image/png' %>
            </span>

            <br>
            <%= form.label :image %>
            <br>
            <%= form.file_field :image, :multiple => true, name: "listing_galleries[image][]" %>

            <br>
            <%= form.submit "Create Listing", class: "button" %>

        <% end %>
    </div>

</div>

</div>

listing_gallery.rb

class ListingGallery < ApplicationRecord

belongs_to :listing

mount_uploader :image, PictureUploader


end

listing_galleries_controller.rb

class ListingGalleriesController < ApplicationController
before_action :set_listing_gallery, only: [:show, :edit, :update, :destroy]

# GET /listing_galleries
# GET /listing_galleries.json
def index
@listing_galleries = ListingGallery.all
end

# GET /listing_galleries/1
# GET /listing_galleries/1.json
def show
end

# GET /listing_galleries/new
def new
@listing_gallery = ListingGallery.new
end

# GET /listing_galleries/1/edit
def edit
end

# POST /listing_galleries
# POST /listing_galleries.json
def create
@listing_gallery = ListingGallery.new(listing_gallery_params)

respond_to do |format|
  if current_user.admin?
    if @listing_gallery.save
      format.html { redirect_to @listing_gallery, notice: 'Listing gallery was successfully created.' }
      format.json { render :show, status: :created, location: @listing_gallery }
    else
      format.html { render :new }
      format.json { render json: @listing_gallery.errors, status: :unprocessable_entity }
    end
  end
end
end

# PATCH/PUT /listing_galleries/1
# PATCH/PUT /listing_galleries/1.json
def update
respond_to do |format|
  if current_user.admin?
    if @listing_gallery.update(listing_gallery_params)
      format.html { redirect_to @listing_gallery, notice: 'Listing gallery was successfully updated.' }
      format.json { render :show, status: :ok, location: @listing_gallery }
    else
      format.html { render :edit }
      format.json { render json: @listing_gallery.errors, status: :unprocessable_entity }
    end
  end
end
end

# DELETE /listing_galleries/1
# DELETE /listing_galleries/1.json
def destroy
  if current_user.admin?
    @listing_gallery.destroy
    respond_to do |format|
    format.html { redirect_to listing_galleries_url, notice: 'Listing   gallery was successfully destroyed.' }
    format.json { head :no_content }
  end
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_listing_gallery
  @listing_gallery = ListingGallery.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def listing_gallery_params
  params.require(:listing_gallery).permit(:listing_id, :image, { image: [] },  :_destroy)
end
end

编辑来自控制器和视图的更多文件。 (对齐在 SO 上可能很时髦,但在项目中没问题。)

【问题讨论】:

    标签: ruby-on-rails carrierwave ruby-on-rails-5


    【解决方案1】:

    对于多张图片上传,您需要将此 gem 添加到您的 gemfile 中

    gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
    

    并允许参数作为控制器中的开放数组:{image: []} 查看 gem 文档以获取更多详细信息 https://github.com/carrierwaveuploader/carrierwave

    您似乎还有一个上传器'image',您没有安装在您的模型中。你只挂载'图片'

    【讨论】:

    • 添加了 gem,运行包安装没有错误,并在我能想到的控制器之间的每个组合中添加了您指出的注释,它仍然表现相同。 x.x 我很欣赏这些提示。还有其他想法吗?
    • 您遇到什么错误或发生了什么?您能否在此处更新您的模型和控制器,以便我们看到您所做的更改?如果您进行了更改并且可能是上传者,请同时更新表格。您使用哪个参数上传多个文件?
    • 使用更改更新了文本(尽管我尝试添加/删除 :images 各种方式)。即使在命令行上,我也没有得到任何响应。它只是挂起,好像它正在尝试上传图像。两个指令集几乎都遵循了 T。感谢您查看所有内容。
    【解决方案2】:

    我真的不知道这是否是一个错字,但您的问题在您视图的第 1 行。

    %= form_for(@listing, html: { mulipart: true}) do |form| %&gt;

    您还缺少 Multipart 的拼写,我想这是您无法上传多张图片的原因。

    改成:

    &lt;%= form_for(@listing, html: { multipart: true}) do |form| %&gt;

    如需了解更多信息,请参阅 Carrierwave 文档的 Multiple File Uploads 部分。

    【讨论】:

    • 感谢您的敏锐目光。这最终没有帮助,但我相信它会带来新的问题。
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 2017-10-14
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多