Search code examples
ruby-on-railsuploadphotoscarrierwave

"undefined method `model_name' for NilClass:Class" with CarrierWave


Now I'm using CarrierWave for upload photos to my site. The problem is that when I open photos/upload (upload.html.erb) show me this error:

undefined method `model_name' for NilClass:Class

Around the line 1 of my upload.html.erb:

<%= form_for @photos, :html => {:multipart => true} do |f| %>  
  <%= f.error_messages %>  
  <%= f.hidden_field :gallery_id %>  
  <p>  
    <%= f.label :name %><br />  
    <%= f.text_field :name %>  
  </p>  
  <p>  
    <%= f.file_field :photo %>  
  </p>  
  <p><%= f.submit %></p>  
<% end %>  

I don't really understand this, because I think that my model (photos.rb) hasn't got errors:

class Photos < ActiveRecord::Base
  attr_accessor :gallery_id, :name, :photo
  belongs_to :gallery
  mount_uploader :photos, PhotosUploader
end

In my photos_controller.rb I have this:

class PhotosController < ApplicationController
  def new
    @photos = Photos.new(:gallery_id => params[:gallery_id])
  end

  def create
    @photos = Photos.new(params[:photos])
    if @photos.save
      flash[:notice] = "Successfully created Photos."
    else
      render :action => 'new'
    end
  end

  def edit
    @photos = Photos.find(params[:id])
  end
  def update
    @photos = Photos.find(params[:id])
    if @photos.update_attributes(params[:photos])
      flash[:notice] = "Successfully updated Photos."
    else
      render :action => 'edit'
    end
  end

  def destroy
    @photos = Photos.find(params[:id])
    @photos.destroy
    flash[:notice] = "Successfully destroyed Photos."
  end
end

And this my photos_uploader.rb:

class PhotosUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end  
  version :thumb do
    process :scale => [180, 180]
  end
end

Regards, Iván


Solution

  • The problem could have something to do with the fact that you've mounted the uploader as :photos, but the form field is :photo. Try making these match.