NoMethodError (неопределенный метод `new 'для nil: NilClass): при попытке создать объект Photo - PullRequest
1 голос
/ 10 февраля 2012

Когда я пытаюсь присвоить объекту данные, отправленные методом POST, я получаю следующую ошибку.

Started POST "/backend/photos" for 127.0.0.1 at 2012-02-10 19:24:48 +0100
Processing by Backend::PhotosController#create as */*
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"yeFZOu6sG3tyNqT4uBb5Xq0fp+1yTZ2wxn0WFPvGhPw=", "photo"=>{"source_type"=>"post", "source_id"=>"5", "cropping"=>"1", "img"=>#<ActionDispatch::Http::UploadedFile:0x00000004798020 @original_filename="p028.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"photo[img]\"; filename=\"p028.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20120210-27534-1yyq97g>>}}
Completed 500 Internal Server Error in 1ms

NoMethodError (undefined method `new' for nil:NilClass):
  app/controllers/backend/photos_controller.rb:5:in `new'
  app/controllers/backend/photos_controller.rb:5:in `create'


  Rendered /usr/local/rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.6ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered /usr/local/rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (5.3ms)

В контроллере:

# -*- encoding : utf-8 -*-
class Backend::PhotosController < Backend::BaseController

  def create
    @photo = Photo.new(params[:photo])

    if @photo.save
      render :json => { :pic_path => @photo.img.url.to_s , :name => @photo.img.instance.attributes["img_file_name"] }, :content_type => 'text/html'
    else
      #todo handle error
      render :json => { :result => 'error'}, :content_type => 'text/html'
    end
  end

В модели:

    # -*- encoding : utf-8 -*-

class Photo < ActiveRecord::Base
  scope :previous, lambda {|p| where("id < ? ", p.id).order(" id desc ").limit(1) }
  scope :next, lambda {|p| where("id > ? ", p.id).order(" id asc ").limit(1) }

  after_save :observe_seq_after_save
  before_create :set_seq_before_create
  after_update :change_seq_after_update
  after_destroy :change_seq_after_destroy

  attr_accessor :cropping
  belongs_to :product
  after_update :reprocess_picture, :if => :cropping?

  has_attached_file :img, :styles => {
    :thumb =>  { :geometry => '130x130#', :quality => 60, :format => 'JPG', :processors => [:cropper]},
    :normal =>  { :geometry => '520x520>', :quality => 90, :format => 'JPG'},
    :big =>  { :geometry => '800x600>', :quality => 90, :format => 'JPG'}
  }

  validates_attachment_presence :img
  validates_attachment_size :img, :less_than => 5.megabytes
  validates_attachment_content_type :img, :content_type => [ 'image/jpeg', 'image/png', 'image/pjpeg' ]

На маршрутах:

  namespace :backend do
      root :to => "dashboards#show"  

      match "/set_per_page_admin" => "sessions#set_per_page_admin"
      match "/posts/:post_id/photos/:id/move_up" => "photos#move_up"
      match "/posts/:post_id/photos/:id/move_down" => "photos#move_down"
      match "/photos/reset_seq" => "photos#reset_seq"

      match "/photos/new/:source_type/:source_id" => "photos#new"
      resources :photos do
        member do
          get :crop
          get :crop_existing_photo
        end
      end


      scope "/remote" do
        match "/show_pic" => "photos#show_pic"
        match "/show_crop" => "photos#show_crop"
      end

      resources :posts
  end

Установлено драгоценных камней:

Gems included by the bundle:
  * actionmailer (3.2.1)
  * actionpack (3.2.1)
  * activemodel (3.2.1)
  * activerecord (3.2.1)
  * activeresource (3.2.1)
  * activesupport (3.2.1)
  * arel (3.0.0)
  * builder (3.0.0)
  * bundler (1.0.21)
  * cocaine (0.2.1)
  * coffee-rails (3.2.2)
  * coffee-script (2.2.0)
  * coffee-script-source (1.2.0)
  * date_validator (0.6.3)
  * erubis (2.7.0)
  * execjs (1.3.0)
  * foreigner (1.1.1)
  * hike (1.2.1)
  * i18n (0.6.0)
  * journey (1.0.1)
  * jquery-rails (2.0.0)
  * json (1.6.5)
  * libv8 (3.3.10.4)
  * magic_encoding (0.0.2)
  * mail (2.4.1)
  * mime-types (1.17.2)
  * multi_json (1.0.4)
  * mysql2 (0.3.11)
  * paperclip (2.6.0 71d3f46)
  * polyglot (0.3.3)
  * rack (1.4.1)
  * rack-cache (1.1)
  * rack-ssl (1.3.2)
  * rack-test (0.6.1)
  * rails (3.2.1)
  * railties (3.2.1)
  * rake (0.9.2.2)
  * rdoc (3.12)
  * rmagick (2.12.0)
  * sass (3.1.15)
  * sass-rails (3.2.4)
  * sprockets (2.1.2)
  * stringex (1.3.0)
  * therubyracer (0.9.9)
  * thor (0.14.6)
  * tilt (1.3.3)
  * treetop (1.4.10)
  * tzinfo (0.3.31)
  * uglifier (1.2.3)
  * will_paginate (3.0.3)

Интересно, что в другом проекте тот же код работает хорошо. Драгоценные камни в этом проекте:

  * actionmailer (3.1.0.rc8)                                                                                                                                                          
  * actionpack (3.1.0.rc8)                                                                                                                                                            
  * activemodel (3.1.0.rc8)                                                                                                                                                           
  * activerecord (3.1.0.rc8)                                                                                                                                                          
  * activeresource (3.1.0.rc8)                                                                                                                                                        
  * activesupport (3.1.0.rc8)                                                                                                                                                         
  * addressable (2.2.6)                                                                                                                                                               
  * arel (2.2.1)                                                                                                                                                                      
  * authlogic (3.1.0)                                                                                                                                                                 
  * aws-s3 (0.6.2)
  * bcrypt-ruby (3.0.1)
  * builder (3.0.0)
  * bundler (1.0.21)
  * date_validator (0.6.3)
  * devise (1.5.3)
  * erubis (2.7.0)
  * execjs (1.3.0)
  * foreigner (1.1.1)
  * heroku (2.18.1)
  * hike (1.2.1)
  * i18n (0.6.0)
  * jquery-rails (1.0.19)
  * json (1.6.5)
  * launchy (2.0.5)
  * libv8 (3.3.10.4)
  * magic_encoding (0.0.2)
  * mail (2.3.0)
  * mime-types (1.17.2)
  * multi_json (1.0.4)
  * mysql2 (0.3.11)
  * nifty-generators (0.4.6)
  * orm_adapter (0.0.6)
  * paperclip (2.3.6)
  * polyglot (0.3.3)
  * rack (1.3.3)
  * rack-cache (1.0.3)
  * rack-mount (0.8.3)
  * rack-ssl (1.3.2)
  * rack-test (0.6.1)
  * rails (3.1.0.rc8)
  * rails-i18n (0.3.0)
  * rails3-jquery-autocomplete (1.0.5)
  * railties (3.1.0.rc8)
  * rake (0.9.2.2)
  * rdoc (3.12)
  * rest-client (1.6.7)
  * rmagick (2.12.0)
  * rubyzip (0.9.5)
  * sprockets (2.0.3)
  * stringex (1.3.0)
  * term-ansicolor (1.0.7)
  * therubyracer (0.9.9)
  * thor (0.14.6)
  * tilt (1.3.3)
  * treetop (1.4.10)
  * tzinfo (0.3.31)
  * uglifier (1.2.2)
  * warden (1.1.0)
  * will_paginate (3.0.2)
  * xml-simple (1.1.1)

Я добавил гем 'aws-sdk', но он ничего не помог. Файл миграции:

class CreatePhotos < ActiveRecord::Migration
  def self.up
    create_table :photos do |t|
      t.string  :source_type, :null => true
      t.integer :source_id, :null => true
      t.integer  :seq
      t.string   :img_file_name
      t.string   :img_content_type
      t.integer  :img_file_size
      t.datetime :img_updated_at

      t.string  :title, :null => true
      t.text    :desc, :limit=>400, :null=>true


      t.string :meta_title, :default => nil
      t.string :meta_desc, :default => nil
      t.string :meta_keywords, :default => nil
      t.timestamps
    end

    add_index(:photos, :source_id)
    add_index(:photos, :source_type)
    add_index(:photos, :seq)
  end

  def self.down
    drop_table :photos
  end
end

У меня нет идей, чтобы решить эту проблему. Спасибо за любую помощь

...