2015-08-07 1 views
0

Моя основная проблема заключается в том, что при загрузке через несущую волну файл по-настоящему не загружается.Carrierwave не создает папку для загрузки

Мой вывод консоли:

#<OptionPic id: 4, image_url: "game_of_thrones___tyrion_lannister_by_stanbos-d79k...", created_at: "2015-08-07 06:08:01", updated_at: "2015-08-07 06:08:01", option_id: 12>]> 

Вызов к изображению следующие

[email protected] do |option| 
      -option.option_pics.each do |op| 
      =image_tag op.image_url.to_s 

Если я проверить элемент на веб-странице, это то, что я получаю:

<img src="/images/game_of_thrones___tyrion_lannister_by_stanbos-d79k0u9_modified.jpg" alt="Game of thrones tyrion lannister by stanbos d79k0u9 modified">

Однако настройки для загрузчика следующие:

class ProductImageUploader < CarrierWave::Uploader::Base 

# Include RMagick or MiniMagick support: 
include CarrierWave::RMagick 
# include CarrierWave::MiniMagick 

# Choose what kind of storage to use for this uploader: 
storage :file 
# storage :fog 

# Override the directory where uploaded files will be stored. 
# This is a sensible default for uploaders that are meant to be mounted: 
def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

Излишне говорить, что у меня нет изображения в папке «Ресурсы/Изображения» или в папке public/uploads.

Это отлично работает в моем другом проекте (папка public/uploads создается с тем же синтаксисом, что и выше), где изображения хранятся как отдельная модель. В моем текущем проекте я хочу, чтобы они были дополнительным вариантом для класса продукта.

структура выглядит следующим образом:

модель - продукт, вариант, optionpic (кривизна)

продукт может иметь множество вариантов, и в своей очереди, вариант может иметь много фотографий. Например - продукт - футболка. Возможные варианты: материал и цвет. Для каждого цвета я хочу другую картину рубашки.

Вот почему у меня есть все, что в моей ProductsController:

Class ProductsController < ApplicationController 

    before_action :find_product, only: [:show] 

    def show 
    end 

    def index 
    @products = Product.all 
    end 

    def new 
    @product = Product.new 
    @option = @product.options.new 
    @option_pic = OptionPic.new 
    end 

    def edit 
    end 

    def create 
    @product = Product.create(product_params) 
    @option = @product.options.create(option_params) 
    @option.product_id = @product.id 
    @option.save 

    @option_pic = @option.option_pics.create(pic_params) 
    @option_pic.option_id = @option.id 

    flash[:success] = "Product successfully created!" 
    redirect_to products_path 
    end 

    private 

    def product_params 
     params.require(:product).permit(:title, :description, :advertising_text, :fancy_quote) 
    end 

    def option_params 
     params.require(:option).permit(:size, :weight, :price, :material, :product_id) 
    end 

    def pic_params 
     params.require(:option_pic).permit(:image_url, :option_id) 
    end 

    def find_product 
     @product = Product.find(params[:id]) 
    end 
end 

Мой optionpic (кривизна) Модель:

class OptionPic < ActiveRecord::Base 
    mount_uploader :product_image, ProductImageUploader 
    belongs_to :option 
end 

Я думаю, что я делаю только некоторые немого новичка ошибки, но после нескольких часов поиск Я просто не могу понять, что не так.

Редактировать

я понял две вещи - я использовал IMAGE_URL вместо picture_image и забыл фактически сохранить значения option_picture в контроллере, т.е. @option_pic.save

Как когда-либо в настоящее время нет передачи данных при загрузке:

SQL (0.3ms) INSERT INTO "option_pics" ("product_image", "option_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["product_image", nil], ["option_id", 18], ["created_at", "2015-08-07 08:03:28.559319"], ["updated_at", "2015-08-07 08:03:28.559319"]] 

Я обновил все значения от: IMAGE_URL до: product_image (в представлении, в pic_params и т.д.)

Edit 2

В соответствии с просьбой, моя форма загрузки:

%h1 Create new product 

=form_for @product, url: products_path do |f| 
    %p 
     =f.label :title 
     =f.text_field :title 
     %br 
     =f.label :description 
     =f.text_area :description 
     %br 
     =f.label :advertising_text 
     =f.text_area :advertising_text 
     %br 
     =f.label :fancy_quote 
     =f.text_area :fancy_quote 

    %p 
     = fields_for @option do |o| 
      =o.label :price 
      =o.text_field :price 
      %br 
      =o.label :size 
      =o.text_field :size 
      %br 
      =o.label :weight 
      =o.text_field :weight 
      %br 
      =o.label :material 
      =o.text_field :material 
    %p 
     = fields_for @option_pic, html: { multipart: true } do |op| 
      = op.label 'Upload image' 
      = op.file_field :product_image 
    =f.submit 

Edit 3

В соответствии с просьбой, мои параметры журнала

Started POST "/products" for ::1 at 2015-08-07 12:25:31 +0300 
Processing by ProductsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"DOeZMvYpdoVmZRpsGmg2Gr9LIc9RYaS1KT1vdfhXI2BJaV3pPZZbZN8PJnvwQAig8wLPpIUORuf7Kjcw3BE6Zg==", "product"=>{"title"=>"fafa", "description"=>"", "advertising_text"=>"", "fancy_quote"=>""}, "option"=>{"price"=>"", "size"=>"", "weight"=>"", "material"=>""}, "option_pic"=>{"product_image"=>"level-3-on-rails-for-zombies-2-0eaaf0109f83459c5aedef30bdf8bd96.png"}, "commit"=>"Create Product"} 
    (0.1ms) BEGIN 
    SQL (0.3ms) INSERT INTO "products" ("title", "description", "advertising_text", "fancy_quote", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["title", "fafa"], ["description", ""], ["advertising_text", ""], ["fancy_quote", ""], ["created_at", "2015-08-07 09:25:31.365739"], ["updated_at", "2015-08-07 09:25:31.365739"]] 
    (0.3ms) COMMIT 
    (0.1ms) BEGIN 
    SQL (0.2ms) INSERT INTO "options" ("size", "material", "product_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["size", ""], ["material", ""], ["product_id", 29], ["created_at", "2015-08-07 09:25:31.369112"], ["updated_at", "2015-08-07 09:25:31.369112"]] 
    (0.3ms) COMMIT 
    (0.1ms) BEGIN 
    (0.1ms) COMMIT 
    (0.1ms) BEGIN 
    SQL (0.3ms) INSERT INTO "option_pics" ("product_image", "option_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["product_image", nil], ["option_id", 21], ["created_at", "2015-08-07 09:25:31.372492"], ["updated_at", "2015-08-07 09:25:31.372492"]] 
    (0.3ms) COMMIT 
Redirected to http://localhost:3000/products 
Completed 302 Found in 10ms (ActiveRecord: 2.1ms) 
+0

Показать код (ERB) вашей формы загрузки. – EugZol

+0

Добавлено в конце – mohnstrudel

+0

Покажите, какие параметры ваш запрос действительно получает - скопируйте строку из 'log/development.log'. Кажется, что у вас есть ошибка при обработке вложенных параметров. – EugZol

ответ

0

Вы не доступ к вашему params правильно. Далее будет исправить:

def pic_params 
    params.require(:option_pic).require(:product_image) 
end 

Кроме того, вы должны сделать свой OptionPic принадлежность к вашему выбору, когда вы строите его:

def new 
    @product = Product.new 
    @option = @product.options.new 
    @option_pic = @option.option_pics.new 
end 
+0

Должен ли я тоже гнездиться? Что-то вроде этого: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html Потому что прямо сейчас я получаю эту ошибку: 'ActionController :: ParameterMissing at/products Параметр отсутствует или значение равно пусто: option' в определение функции option_params params.require (: продукт) .require (: опция) .permit (: размер,: вес,: цена,: материал,: pRODUCT_ID) end' – mohnstrudel

+0

@mohnstrudel Извините, я ошибся в вложенных хешах. Вы должны изменить 'image_url' на' product_image', но мы еще не закончили эту проблему. Ваш клиент, похоже, не отправляет файл.У вас есть javascript на странице, которая перехватывает загрузки? Как добавить плагины отчетов о ходе выполнения проекта или что-то еще? – EugZol

+0

Да, я уже переименовал все image_url в product_image. И я использую шаблон бутстрапа, однако я попробовал представить форму с полностью отключенным javascript, но безрезультатно. Я помню, когда у меня было image_url вместо product_image, мое приложение, по крайней мере, сохранит URL-адрес, например. '/ images/game_of_thrones ___ tyrion_lannister_by_stanbos-d79k0u9_modified.jpg – mohnstrudel

0

Если кто-то сталкивается с той же проблемой, я вывешу мое решение - я решил воссоздать эту систему, используя вложенные атрибуты, теперь все работает нормально!

Так вот у меня есть 3 модели:

class Product < ActiveRecord::Base 

    belongs_to :category 
    belongs_to :subcategory 
    has_many :options 

    has_and_belongs_to_many :product_sizes 

    accepts_nested_attributes_for :options 

end 

Класс вариант, который является дочерним продуктом

class Option < ActiveRecord::Base 
    belongs_to :product 
    has_many :option_pics 

    accepts_nested_attributes_for :option_pics 
end 

И, наконец, option_pic, ребенок вариант

class OptionPic < ActiveRecord::Base 
    mount_uploader :product_image, ProductImageUploader 
    belongs_to :option 
end 

В контроллере товаров мои новые действия и действия создаются следующим образом:

def new 
    @product = Product.new 
    option = @product.options.build 
    option_pic = option.option_pics.build 
    end 

    def edit 
    end 

    def create 
    @product = Product.new(product_params) 

    if @product.save! 
     flash[:success] = "Product successfully created!" 
     redirect_to products_path 
    end 
    end 

    private 

    def product_params 
     params.require(:product).permit(
     :title, :description, :advertising_text, :fancy_quote, :category_id, 
     options_attributes: [:size, :weight, :price, :material, :product_id, 
      option_pics_attributes: [:product_image, :option_id]]) 
end 

def find_product 
    @product = Product.find(params[:id]) 
end 

Строковые параметры являются двойными вложенными, что важно. Также важна структура для form_for помощника. Я не реорганизовал его, так что сейчас это один большой список. Структура там очень важна, у меня были поля для option_pic, предназначенные на уровне переменной «f», что имело решающее значение, и изображения не были загружены.

=form_for @product, url: products_path do |f| 
    %p 
     =f.label :title 
     =f.text_field :title 
     %br 
     =f.label :description 
     =f.text_area :description 
     %br 
     =f.label :advertising_text 
     =f.text_area :advertising_text 
     %br 
     =f.label :fancy_quote 
     =f.text_area :fancy_quote 
     %br 
     =f.label :category_id 
     =f.collection_select :category_id, Category.all, :id, :title, { prompt: 'Please select category' } 
     %br 
     =f.label 'Product Size' 
     =f.collection_check_boxes(:product_size_ids, ProductSize.all, :id, :size) 

    %p 
     = f.fields_for :options do |builder| 
      =builder.label :price 
      =builder.text_field :price 
      %br 
      =builder.label :size 
      =builder.text_field :size 
      %br 
      =builder.label :weight 
      =builder.text_field :weight 
      %br 
      =builder.label :material 
      =builder.text_field :material 
      %br 
      =builder.fields_for :option_pics do |op| 
       = op.label 'Upload image' 
       = op.file_field :product_image 
    =f.submit 

И вуаля, замечательное обязательство:

(0.1ms) BEGIN 
    SQL (0.4ms) INSERT INTO "products" ("title", "description", "advertising_text", "fancy_quote", "category_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["title", "builder"], ["description", ""], ["advertising_text", ""], ["fancy_quote", ""], ["category_id", 1], ["created_at", "2015-08-11 11:34:11.618298"], ["updated_at", "2015-08-11 11:34:11.618298"]] 
    SQL (0.2ms) INSERT INTO "options" ("size", "price", "material", "product_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["size", ""], ["price", 555], ["material", ""], ["product_id", 82], ["created_at", "2015-08-11 11:34:11.619678"], ["updated_at", "2015-08-11 11:34:11.619678"]] 
    SQL (0.5ms) INSERT INTO "option_pics" ("product_image", "option_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["product_image", "b3c839_bd43d840e031469495137fa74e31faf4.jpg_srz_428_428_75_22_0.5_1.2_75_jpg_srz"], ["option_id", 66], ["created_at", "2015-08-11 11:34:11.620837"], ["updated_at", "2015-08-11 11:34:11.620837"]] 
    (0.3ms) COMMIT 
Смежные вопросы