2015-05-27 4 views
0

Я хочу создать функцию в своем контроллере, чтобы сохранить изображение, загруженное администратором. Я не хочу использовать плагин или Activerecord, просто функцию для записи байтов изображения в каталог app/assets/images /. Итак, когда администратор создает новый продукт, он помещает изображение продукта в приложение. Я хочу использовать эту функцию в действии createProduct Controller. Таким образом, прежде чем сохранять в db новый продукт, изображение будет сохранено в приложении (а не в db, я хочу просто написать байты). Я искал в Интернете, и я основал функцию для сохранения изображения. У меня странное сообщение об ошибке: undefined method чтения»для "picture.png": String` Здесь все мои вещи:Загрузить изображение NO plugin NO activerecord

edit.html.erb

<h1>Editing product</h1> 

<%= render 'form' ,:multipart => true%> 

<%= link_to 'Show', @product %> | 
<%= link_to 'Back', products_path %> 

_form.html.erb

<%= form_for(@product) do |f| %> 
    <% if @product.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2> 

     <ul> 
     <% @product.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </div> 
    <div class="field"> 
    <%= f.label :image_url %><br> 
    <%= f.text_field :image_url %> 
    </div> 
    <div class="field"> 
    <%= f.label :price %><br> 
    <%= f.text_field :price %> 
    </div> 
    <div class="field"> 
    <%= f.label :upload %><br> 
     <%= file_field :upload, :datafile %></p> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

product_controller.rb

def create 

     name = params[:upload][:datafile] 
    directory = Rails.root.join('app', 'assets','images') 
    # create the file path 
    path = File.join(directory, name) 
    # write the file 
    File.open(path, "wb") { |f| f.write(params[:upload][:datafile].read) } 


    @product = Product.new(product_params) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render :show, status: :created, location: @product } 
     else 
     format.html { render :new } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

enter image description here Благодарю вас за помощь.

EDIT: новая ошибка

enter image description here

ответ

1

Поскольку вы используете form_for, фактический временный файл будет в params[:product][:upload]. Попробуйте

в пределах _form.html.erb частичного изменение file_field строку

<%= file_field :upload %> 

Затем в ваших create действий

name = params[:product][:upload].original_filename 
directory = Rails.root.join('app', 'assets','images') 
# create the file path 
path = File.join(directory, name) 
# write the file 
File.open(path, "wb") { |f| f.write(params[:product][:upload].read) } 
+0

привет, спасибо за ответ я. Я сделал это, но у меня есть эта ошибка: ArgumentError в продуктах # новое неправильное количество аргументов (1 для 2..3). Я публикую новый экран на главном сообщении – Vito

+0

. Мне нужно поставить: '<% = f.file_field: upload%>' вместо '<% = file_field: upload%>'. Но теперь у меня есть эта ошибка: ActiveRecord :: UnknownAttributeError в ProductsController # создать неизвестный атрибут: загрузить – Vito

+1

@Vito - это потому, что 'upload' не является атрибутом вашей модели' products'. Измените '@product = Product.new (product_params)' на '@product = Product.new (product_params.except (: upload))' и это должно работать. –