0
votes

I know there are a couple questions around this topic, one is almost identical since we followed the same tutorial, but none of the answers are working for me. I followed emerson lackey's tutorial on attaching multiple images with paperclip (http://emersonlackey.com/screencasts/rails-3-with-paperclip.mov) and am having the error Can't mass-assign protected attributes: assets_attributes. One note as you look at the code, I had been running with only image per post so there is terminology for images vs. assets that will be deleted but need right now for the rest of the site to work.

I have created an Asset ID and added it to the asset model. Also note that I have Pins instead of Posts.

In the pin.rb Model:

class Pin < ActiveRecord::Base
attr_accessible :description, :image, :image_remote_url, :Designer, :price, :retail_value, :condition, :lender_notes, :size, :material, :color, :classification, :item_category, :asset_attributes

validates :user_id, presence: true
validates :description, presence: true
validates :Designer, presence: true
validates :size, presence: true
validates :color, presence: true
validates :material, presence: true
validates :price, presence: true
validates :retail_value, presence: true
validates :condition, presence: true
validates :lender_notes, presence: true
validates :classification, presence: true
validates :item_category, presence: true
validates_attachment :asset, presence: true,
                            content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] },
                            size: { less_than: 5.megabytes }                            
belongs_to :user
has_many :line_items
has_many :assets
accepts_nested_attributes_for :assets, :allow_destroy => true
before_destroy :ensure_not_referenced_by_any_line_item
has_attached_file :image, styles: { medium: "320x240"}

# ensure that there are no line items referencing this product
def ensure_not_referenced_by_any_line_item 
    if line_items.empty?
        return true 
    else
        errors.add(:base, 'Line Items present')
    return false
    end
end

def image_remote_url=(url_value)
    self.image = URI.parse(url_value) unless url_value.blank?
    super 
end 
 end

In the asset.rb model:

class Asset < ActiveRecord::Base
attr_accessible :asset

belongs_to :pin
has_attached_file :asset, :styles => { :large => "640x480", :medium => "320x240", :thumb => "100x100>" }

end

in the pins_controller.rb file:

class PinsController < ApplicationController
before_filter :authenticate_user!, except: [:index]

def index
@pins = Pin.order("created_at desc").page(params[:page]).per_page(20)

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @pins }
  format.js
 end
end

def show
 @pin = Pin.find(params[:id])

 respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @pin }
 end
end

def new
 @pin = current_user.pins.new
 5.times { @pin.assets.build }

 respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @pin }
 end
end

def edit
 @pin = current_user.pins.find(params[:id])
 5.times { @pin.assets.build }
end

def create
 @pin = current_user.pins.new(params[:pin])

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

def update
 @pin = current_user.pins.find(params[:id])

 respond_to do |format|
   if @pin.update_attributes(params[:pin])
    format.html { redirect_to @pin, notice: 'Pin was successfully updated.' }
    format.json { head :no_content }
   else
    format.html { render action: "edit" }
    format.json { render json: @pin.errors, status: :unprocessable_entity }
   end
 end
end

def destroy
 @pin = current_user.pins.find(params[:id])
 @pin.destroy

 respond_to do |format|
   format.html { redirect_to pins_url }
   format.json { head :no_content }
  end
 end
end

In the _form.html.erb file:

<%= simple_form_for(@pin, :html => { :multipart => true}) do |f| %>
 <%= f.full_error :asset_file_size, class: "alert alert-error" %>
 <%= f.full_error :asset_content_type, class: "alert alert-error" %>
 <%= f.fields_for :assets do |asset_fields| %>
 <%= asset_fields.file_field :asset %>
<% end %>

<div class="form-actions">
 <%= f.button :submit, class: "btn btn-primary" %>
</div>

<% end %>

Thank you!!!!!

1

1 Answers

1
votes

You said the error is:

Can't mass-assign protected attributes: assets_attributes

You don't have this defined in attr_accessible; you have :asset_attributes but not :assets_attributes

Try changing it to the plural version.