Jest już podobne pytanie tutaj Rails + CarrierWave: NoMethodError: undefined method `name' dla nil:NilClass, ale rozwiązanie tam było naprawić literówkę.

Używam już Railsów i Carrierwave w tym samym projekcie bez żadnych problemów. Istnieje prosty model AR:

class Upload < ActiveRecord::Base
  attr_accessible :title, :data_file, :caption
  mount_uploader :upload, DataFileUploader

  validates :title, :data_file, :presence => true
end

W sterowniku jak zwykle:

def create
  @upload = Upload.new(params[:upload])

  if @upload.save
    redirect_to new_admin_upload_path, :notice => t("site.successfully_created_resource")
  else
    render :action => 'new'
  end
end

Prosty. Podczas przesyłania formularza pojawia się następujący błąd:

ActiveRecord::StatementInvalid in Admin::UploadsController#create

NoMethodError: undefined method `name' for nil:NilClass: INSERT INTO "uploads" ("caption",    
"created_at", "data_file", "title", "updated_at") VALUES (?, ?, ?, ?, ?)

Nie widzę błędu i nie rozumiem, skąd się wzięła nazwa. Pomijając mount_uploader :upload, DataFileUploader w modelu AR, wszystko działa bez zarzutu.

Co tu jest nie tak?

Wielkie dzięki!

3
awenkhh 7 marzec 2012, 03:45

2 odpowiedzi

Najlepsza odpowiedź

Miałem dokładnie ten sam błąd i rozwiązaniem było podłączenie uploadera do istniejącego pola w moim modelu. Na przykład poprawka będzie polegać na zmianie z

class Upload < ActiveRecord::Base
  attr_accessible :title, :data_file, :caption
  mount_uploader :upload, DataFileUploader

  validates :title, :data_file, :presence => true
end

Do

class Upload < ActiveRecord::Base
  attr_accessible :title, :data_file, :caption
  mount_uploader :data_file, DataFileUploader

  validates :title, :data_file, :presence => true
end

Jeśli masz pole data_file w modelu Prześlij i nie masz pola przesyłania (pomocne będzie sprawdzenie pliku db/schema.rb).

5
Artem Kiselev 6 sierpień 2012, 01:23

Nie mogłem znaleźć rozwiązania, dlaczego powyższy kod nie działa, ale stworzyłem nowy model o nazwie DataFile i nowy uploader o nazwie FileUploadUploader. To faktycznie działa. Sądzę więc, że może wystąpić konflikt nazewnictwa, ponieważ nazwałem model Upload. Ale to tak naprawdę tylko przypuszczenie ...

0
awenkhh 10 marzec 2012, 00:31