【问题标题】:Paperclip error - Can't mass-assign protected attributes回形针错误 - 无法批量分配受保护的属性
【发布时间】:2013-07-29 20:15:55
【问题描述】:

我知道围绕这个主题有几个问题,一个几乎相同,因为我们遵循相同的教程,但没有一个答案对我有用。我按照艾默生走狗的教程使用回形针附加多个图像 (http://emersonlackey.com/screencasts/rails-3-with-paperclip.mov) 并遇到错误无法批量分配受保护的属性:assets_attributes。请注意,当您查看代码时,我一直在运行每个帖子只使用图像,因此存在图像与资产的术语,这些术语将被删除,但现在需要网站的其余部分才能正常工作。

我创建了一个资产 ID 并将其添加到资产模型中。另请注意,我有 Pin 图而不是帖子。

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

谢谢!!!!!!

【问题讨论】:

    标签: ruby-on-rails-3 paperclip mass-assignment


    【解决方案1】:

    你说的错误是:

    Can't mass-assign protected attributes: assets_attributes
    

    你没有在 attr_accessible 中定义这个;你有:asset_attributes 但没有:assets_attributes

    尝试将其更改为复数版本。

    【讨论】:

    • 两者都试过了 - 如果我输入 assets_attributes 我收到错误:NoMethodError in PinsController#create undefined method `asset' for #<0x00000102bbea10>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多