回形针"宝石" Rails 3.1未定义的方法模型文件名

时间:2012-01-10 05:49:22

标签: ruby-on-rails-3.1 amazon-s3 paperclip

使用rails 3.1.1,Ruby 1.9.2, 宝石:宝石'haml',宝石'simple_form',宝石'aws-sdk',
gem'Paperclip',: git => “混帐://github.com/thoughtbot/paperclip.git”
插件:country_select:git://github.com/rails/country_select.git

通过回形针(GEM)上传/显示推送到Amazon S3的图像时出现问题 错误:#Player的未定义方法`avatar_file_name':0x00000102aff228

在大多数情况下,我在git-hub页面上关注回形针的示例 https://github.com/thoughtbot/paperclip

以下是我的代码中的内容:

迁移: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

型号: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档案: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

查看: 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
...

研究: 我发现很多与迁移的插入和生成有关,但这一切看起来都很古老。他们中的大多数建议在4个属性的迁移中加入。然而,似乎应该被一行替换为t.has_attached_file:avatar。

我有一个rails 3.0项目,这很有用。我可以上传产品并将其拉下来。 (必须使用建议的image_tag @ icon.avatar.url并将其转换为%img {:src =&gt; URI.unescape(icon.icon.url)}但这是一个不同的问题。)

1 个答案:

答案 0 :(得分:1)

TLDR:修复了来自@player =&gt;的index.html.haml中的拼写错误玩家,已添加:attr_accessible的头像。

今天早上我醒来时遇到了不同的错误。

而不是:undefined method Avatar_file_name'

我得到了:未定义的方法avatar' for nil:NilClass

该错误导致在我的代码中购买一个简单的类型。我使用了一个实例vairable而不是我应该使用的.each变量(index.html.haml:9)

现在应用程序没有犯错,但文件仍未上传。 在开发日志中我找到了这个。 (我第一次发布时没看到这里)

警告:无法批量分配受保护的属性:头像

然后我去了补充:attr_accessible的头像,一切都开始工作了。

不确定这是否应该是必需的,但我确实看到他们昨天更新了S3标题为proc。 https://github.com/thoughtbot/paperclip/tree/master/test/storage

我不打算关闭它。将进行编辑,因为我将使用该版本并快速报告我今天的发现。然后我会关闭它。

编辑: 我尝试切换回2.4.5并且我得到的错误让我首先切换到拉大师。尝试使用t.has_attached_file:avatar进行迁移时,无法迁移并出现以下错误。

未定义的方法`has_attached_file'用于#ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: TableDefinition:0x00000105053600

我想我会坚持从主人那里拉。