我需要将多个图片上传到我正在构建的应用中的产品。
图片通过ActiveAdmin
与paperclip
上传一张图片没有问题,但多张图片无效。
我已尝试使用jquery-fileupload-rails
宝石,它应该连接到active admin
,但没有运气。
我也在网上搜索了这个并查看了Stack Overflow上的很多帖子,但我还没有找到解决方案。
以下是产品型号product.rb
class Product < ActiveRecord::Base
acts_as_list :scope => [:category, :label]
belongs_to :category
belongs_to :label
has_many :product_items, :dependent => :destroy
validates :title, :description, presence: true
validates :price_usd, :price_eur, numericality: {greater_than_or_equal_to: 0.01}
validates :title, uniqueness: true
has_attached_file :image, styles: { medium: "500x500#", thumb: "100x100#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
第三次更新
好的,我在images_attributes:
products_controller.rb
下面添加了def product_params
def product_params
params.require(:product).permit(:title, :description,...., images_attributes: [:image , :id , :_destroy])
end
我添加的admin/product.rb
f.has_many :images , heading: false, allow_destroy: true do |ff|
ff.input :image, required: true, as: :file
end
现在我可以通过主动管理员选择图像,但它不会保存到数据库中。
另一个更新
以下是app/views/pages/index.html.erb
在索引页面上的该片段中,显示了每个类别中的最新上传内容。了解应用如何循环浏览产品并向每个产品显示相应的图像。现在,我在索引文件中从此行<%= image_tag product.image.url(:medium), class: "img-responsive" %>
收到错误。
<div class="container-fluid">
<% @products.each_slice(3) do |products_group| %>
<div class="row">
<% products_group.each do |category, products| %>
<% products.each_with_index do |product, index| %>
<% if index == 0 %>
<div class="col-lg-4 col-sm-6 col-xs-12 center-block " >
<%= link_to category_path (category), { :method => 'GET' } do %>
<%= image_tag product.image.url(:medium), class: "img-responsive" %>
<% end %>
<div class="caption">
<p class="category-name" ><%= product.category.name %></p>
</div>
<% end %>
<% end %>
</div>
<% end %>
</div>
<% end %>
</div>
更新
here is the `products_controller.rb`
class ProductsController < ApplicationController
before_action :set_product, only: [:show, :edit, :update, :destroy]
def show
offset = rand(100)
@products_rand = Product.where(category_id:
@product.category_id).order("RANDOM()").limit(6)
end
private
# Use callbacks to share common setup or constraints between actions.
def set_product
@product = Product.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def product_params
params.require(:product).permit(:title, :description, :price_usd, :price_eur, :image, :category_id, :stock_quantity, :label_id, :query, :slug)
end
end
这是主动管理产品型号admin/product.rb
ActiveAdmin.register Product do
config.sort_order = 'position_asc' # assumes you are using 'position' for your acts_as_list column
config.paginate = true # optional; drag-and-drop across pages is not supported
sortable # creates the controller action which handles the sorting
permit_params :title, :slug, :description, :stock_quantity, :image, :price_usd, :price_eur, :category_id, :label_id, images_attributes: [:image , :id , :_destroy]
index do
sortable_handle_column # inserts a drag handle
column :title
column :slug
column :category
column :label
column :created_at
column :stock_quantity
column :price_eur, :sortable => :price_eur do |product|
number_to_currency(product.price_eur, :unit => "€ " , :precision => 0)
end
column :price_euro, :sortable => :price_usd do |product|
number_to_currency(product.price_usd, :unit => "$ " , :precision => 0)
end
actions
end
form multipart: true do |f|
f.inputs "Product Details" do
f.input :title
f.input :slug
f.input :description, as: :ckeditor, input_html: { ckeditor: { toolbar: 'Full' } }
f.input :stock_quantity
f.input :image, required: false
f.input :price_usd
f.input :price_isl
f.input :category
f.input :label
end
f.actions
end
end
最后这里是产品视图,`app / views / products / show.html.erb``
<div class="container">
<div class="row product_top text-center">
<div class="col-xs-12 col-sm-6 center-block">
<div class="product_description">
<h3 class="title"><%= @product.title %></h3>
<p class="label-product"><%= @product.label.name %></p>
<p class="description">Description</p>
<p class="product-description"><%= @product.description.html_safe %></p>
<% if @product.stock_quantity <= 0 %>
<p> Out of stock </p>
<% end %>
</div>
<div class="col-xs-12">
<p class="product-price"> Price:</p> <%= number_to_currency(@product.price_usd, :unit => "€ " , :precision => 0) %> | <%= number_to_currency(@product.price_isl.to_i, :unit => "IKR " , :precision => 0) %>
</div>
<%# if @product.stock_quantity >= 1 %>
<div class="row text-center add-cart-wrapper">
<% if @product.stock_quantity >= 1 %>
<%= link_to 'Add to Cart', product_product_items_path(@product), :method => :post, class: 'add-to-cart'%>
<% end %>
</div>
</div>
<div class="col-xs-12 col-sm-6 center-block" >
<%= image_tag @product.image.url(:medium), class: "img-responsive center-block" %>
</div>
</div>
<div class="row product-teaser">
<h4 class="text-center teaser-text"> similar products to <%= @product.title %> : </h4>
<% @products_rand.each do |product| %>
<div class="col-sm-2 col-xs-3 center-block product-thumbs-product-view" >
<%= link_to product_path (product) do %>
<%= image_tag product.image.url, :size => "100%x100%", class: "img-responsive center-block" %>
<% end %>
<h5 class="text-center"><%= link_to product.title, product, class: "text-center" %></h5>
</div>
<% end %>
</div>
</div>
答案 0 :(得分:3)
正如您所拥有的那样,该模型只能在其image
属性中保存一个文件。您需要在产品中添加has_many
关联,以便它可以包含多个文件。
即。创建一个图像模型,用于保存附件并与产品相关联:
rails g model Image product_id:integer image_file_name:string image_file_size:integer image_content_type:string
rake db:migrate
然后将产品与之关联:
class Product < ActiveRecord::Base
has_many :images
# ... the rest of your code...
end
将附加的文件声明移动到Image模型:
class Image < ActiveRecord::Base
belongs_to :product
has_attached_file :image, styles: { medium: "500x500#", thumb: "100x100#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
现在您可以将许多图像与一种产品相关联:
product = Product.new
product.images.build image: File.open('some/image/for/example.jpg', ?r)
product.save
product.images.first.image # the Paperclip::Attachment object
由于您没有发布任何控制器,视图代码或active_admin设置,但我只能read rails或active_admin documentation on nested resources,因此您可以了解如何编写一个嵌套表单,让您为产品创建这些图像。
更新:如果通过“进一步采纳此答案”,则表示“为您编写代码”然后,不。这里和active_admin documentation on nested resources中有足够的信息供您查明。但是,如果任何一个令人困惑,我可以提供澄清。