1
votes

Using rails 3.1.1, Ruby 1.9.2, Gems: gem 'haml', gem 'simple_form', gem 'aws-sdk',
gem 'paperclip', :git => "git://github.com/thoughtbot/paperclip.git"
plugin: country_select: git://github.com/rails/country_select.git

Having an issue uploading/displaying images pushed to Amazon S3 through paperclip (GEM) Error: undefined method `avatar_file_name' for #Player:0x00000102aff228

For the most part I was following the example on the git-hub page for paperclip https://github.com/thoughtbot/paperclip

Here is what I have in my code:

Migration: 20111224044508_create_players.rb

class CreatePlayers < ActiveRecord::Migration
  def change
    create_table :players do |t|
      t.string :first_name
      t.boolean :first_name_public, :default => false
      ...
      t.string :website
      t.boolean :website_public, :default => false
      t.has_attached_file :avatar

      t.timestamps
     end
  end
end

Model: Player.rb:

class Player < ActiveRecord::Base
  attr_accessible :first_name, ... :website 
  validates_presence_of :username, :email

  has_attached_file :avatar, 
                    :styles => { :medium => "300x300>", :thumb => "100x100>" },
                    :storage => :s3,
                    :s3_credentials => "#{Rails.root}/config/s3.yml",
                    :path => ":class/:id/:style/:filename"

  {Unrelated validations}
end

S3 file: s3.yml

development:
    bucket: voh_development
    access_key_id: *********************
    secret_access_key: ********************
staging:
    bucket: voh_staging
    access_key_id: *********************
    secret_access_key: ********************
production:
    bucket: voh_production
    access_key_id: *********************
    secret_access_key: ********************

Controller: players_controller.rb

class PlayersController < ApplicationController

  def create
    @player = Player.create(params[:player])

    if @player.save 
      redirect_to players_path, :notice => "Player Created"; 
    else 
      render :action => 'new' 
    end
  end

  {basic restful}

end

Views: Edit.html.haml + New.html.haml

= simple_form_for @player do |f|
  = f.input :first_name
  ...
  = f.input :website
  = f..file_field :avatar 
  .input_div      
    = f.button :submit

index.html.haml

    ...
    %td Avatar
    %td First Name
    ...
    %td Actions
  - @players.each do |player|
    %tr
      %td
        = image_tag @player.avatar.url(:thumb)
      %td
        = player.first_name
      ...
      %td
        = link_to ' Show ', player_path(player.id)
        |
        = link_to ' Edit ', edit_player_path(player.id)

show.html.haml

= image_tag @user.avatar.url
%br
= @player.first_name
...

Research: I found a lot to do with the pluging and genration of the migration but it all seems old. Most of them suggest putting in the up down in the migration for the 4 attributes. However it seems that should have been replaced by the one line t.has_attached_file :avatar.

I have a rails 3.0 project and this worked. I am able to upload products and pull them back down. (had to play with the suggested image_tag @icon.avatar.url and turned it into %img{:src => URI.unescape(icon.icon.url)} but that a different question.)

1

1 Answers

1
votes

TLDR: Fixed typo in index.html.haml from @player => player, Added :avatar to attr_accessible.

I woke up this morning and had a different error.

instead of: undefined method Avatar_file_name'

I got: undefined method avatar' for nil:NilClass

That error was caused buy a simple type in my code. I used an instance vairable instead of .each variable I should have been using (index.html.haml:9)

Now the app was not erring out but the file was still not uploading. In the development log I found this. (I did not look here the first time I posted)

WARNING: Can't mass-assign protected attributes: avatar

I then went and added :Avatar to attr_accessible and everything started working.

Not sure if this is supposed to be required or not but I did see that they had updated S3 header to be a proc yesterday. https://github.com/thoughtbot/paperclip/tree/master/test/storage

I am not going to close this out yet. There will be an edit because I am going to play with the version and quickly report my findings today. Then I will close this out.

Edit: I tryed switch back to 2.4.5 and I am getting the error that made me switch to pulling master in the first place. When attempting to do a migration with t.has_attached_file :avatar it fails to migrate and gives the following error.

undefined method `has_attached_file' for #ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition:0x00000105053600

I think I will stick with pulling from master.