2013-07-29 1 views
0

Я знаю, что есть пара вопросов по этой теме, одна из которых почти идентична, поскольку мы следовали одному и тому же учебнику, но ни один из ответов не работает для меня. Я последовал за учебником Emerson по работе с лакеем по прикреплению нескольких изображений с помощью paperclip (http://emersonlackey.com/screencasts/rails-3-with-paperclip.mov), и у меня есть ошибка. Нельзя назначать защищенные атрибуты: assets_attributes. Одна заметка, когда вы смотрите на код, я работал только с изображением за сообщение, поэтому есть терминология для изображений и активов, которые будут удалены, но сейчас нужно, чтобы остальная часть сайта работала.Ошибка скрепки - Невозможно назначить защищенные атрибуты

Я создал идентификатор объекта и добавил его в модель активов. Также обратите внимание, что у меня есть Pins вместо Posts.

В pin.rb Модель:

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 

В модели asset.rb:

class Asset < ActiveRecord::Base 
attr_accessible :asset 

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

end 

в файле pins_controller.rb:

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 

В _form. html.erb файл:

<%= 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 %> 

Спасибо !!!!!

ответ

1

Вы сказали, что ошибка:

Can't mass-assign protected attributes: assets_attributes 

Вы не имеете это определено в attr_accessible; у вас есть :asset_attributes, но не :assets_attributes

Попробуйте изменить его на множественное число.

+0

попробовал оба - если я тип assets_attributes я получаю ошибку: NoMethodError в PinsController # создать неопределенного метода 'активов» для #

+0

Это означает, что вам необходимо также определить 'метод asset' на Модель штифта. Попробуйте включить как ': assets_attributes', так и': asset' в ваш 'attr_accessible' – tyler

+0

без изменений, к сожалению –