0

is there another way to store multiple images using paperclip instead of this one that i used because it looks ugly

this is how the form looks like

this is the code

app/views/posts/_form.html.erb

 <%= simple_form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %>
  <%= f.input :title %>
  <%= f.input :description %>

      <%= f.simple_fields_for :pictures do |builder| %>
     <% if builder.object.new_record? %>

      <%= builder.input :image, :input_html => { :multiple => true } %>
     <% end %>
      <% end %>

  <%= f.input :price %>
  <%= f.input :city %>
  <%= f.input :phone %>

  <%= f.button :submit %>
<% end %>

and this is the new and create actions in posts_controller

app/controllers/posts_controller.rb

  def new
    @post = current_user.posts.build
    @post.pictures.build
  end

  def create
    @post = current_user.posts.build(post_params)

    if @post.save
      params[:image].each do |picture|      

        @post.images.create(:image=> picture)

      end
      redirect_to root_path
    else
      redirect_to new_post_path 
    end     
  end
  private

  def post_params
       params.require(:post).permit( :title, :price, :description, :phone, :image, :city, pictures_attributes: [:image] )
  end

now there is an error Unpermitted parameter: image

Started POST "/posts" for 127.0.0.1 at 2016-08-18 07:04:27 +0100
Processing by PostsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"1M2k+ZnouBRdtP6/EDHtLtewiwiS32uSLcZldPNghFt/8n81txtUAAdbKzlCpn6x5l4RJNZYYqV7OVTs6pyvBQ==", "post"=>{"title"=>"setst", "description"=>"setset", "pictures_attributes"=>{"0"=>{"image"=>[#<ActionDispatch::Http::UploadedFile:0xa337e44 @tempfile=#<Tempfile:/tmp/RackMultipart20160818-20404-fu0x0v.jpg>, @original_filename="column-01.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post[pictures_attributes][0][image][]\"; filename=\"column-01.jpg\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0xa337e30 @tempfile=#<Tempfile:/tmp/RackMultipart20160818-20404-1sidf3n.png>, @original_filename="fiy_away.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"post[pictures_attributes][0][image][]\"; filename=\"fiy_away.png\"\r\nContent-Type: image/png\r\n">]}}, "price"=>"3", "city"=>"setset", "phone"=>""}, "commit"=>"Create Post"}
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 2], ["LIMIT", 1]]
Unpermitted parameter: image
   (0.2ms)  begin transaction
   (0.1ms)  rollback transaction
Redirected to http://localhost:3000/posts/new
Completed 302 Found in 26ms (ActiveRecord: 0.8ms)

i want to use only on file field to add all the images and store them as an array is that possible !!!

this is the repo https://github.com/vogdev/colne2

Akki Soufiane
  • 25
  • 3
  • 9
  • use cocoon gem : https://github.com/nathanvda/cocoon – Emu Aug 18 '16 at 04:43
  • try this - http://stackoverflow.com/questions/11605787/uploading-multiple-files-with-paperclip#19379756 – PGill Aug 18 '16 at 04:49
  • Unpermitted parameter: image . `params.require(:post).permit( :title, :price, :description, :phone, :image, :city, pictures_attributes: [:image] )` – Akki Soufiane Aug 18 '16 at 06:24

2 Answers2

0

i found the solution of this problem all i did is i removed the simple_form and used the normal form_for

<%= form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %>

<%= f.label :title %>
<%= f.text_field :title %>

<%= f.label :description %>
<%= f.text_field :description %>

      <%= f.fields_for :pictures do |builder| %>

   <%= f.label :pictures, :class => 'control-label' %>

   <%= file_field_tag "images[]", type: :file, multiple: true %>

      <% end %>
<%= f.label :price %>
<%= f.text_field :price %>

  <%= f.label :city %>
<%= f.text_field :city %>

  <%= f.label :phone %>
<%= f.text_field :phone %>


  <%= f.submit nil, :class => 'btn btn-primary' %>
<% end %>

and in the create action in the posts_controller

def create

    @post = current_user.posts.build(post_params)


    if @post.save
       if params[:images]
        #===== The magic is here ;)
        params[:images].each { |image|
          @post.pictures.create(image: image)
        }
      end
      redirect_to root_path
    else
      redirect_to new_post_path 
    end     
  end
Akki Soufiane
  • 25
  • 3
  • 9
0

I have a similar problem on Rails 5 with nested resource, and I found the solution only adding multiple: true on file_field.

I have two models Medic and Patient. Patient is a nested resource from Medic, I'm using Devise, so I can access @patient = current_medic.patient

In the view:

<%= form_for @patient, url: patients_path, html: { multipart: true } do |f| %>
  <%= f.file_field :image, multiple: true %>
<% end %>

EDIT - Create method:

def create
  @patient = current_medic.patients.new(patient_params)

  respond_to do |format|
    if @patient.save
      format.html { redirect_to @patient, :flash => { :success => 'Patient was successfully created.' } }
    else
      format.html { render :new }
    end
  end
end

Hope this help!

Carlos Gómez
  • 453
  • 7
  • 16