开发者

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

开发者 https://www.devze.com 2023-03-15 03:18 出处:网络
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:

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.r开发者_Go百科b) 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


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.


The Problem can be fixed by instantiating the object photo object. I think that should fix the problem.


I am answering it late as in can see there is no upload action in photos controller that matches with template upload.html.erb

I suggest you to rename it to new.html.erb and try accessing the url 'photos/new'


I had the same problem and searching got me to this answer https://stackoverflow.com/a/21992187/3280686

You need to add this on your Class PhotosUploader

include CarrierWaveDirect::Uploader
include ActiveModel::Conversion
extend ActiveModel::Naming
0

精彩评论

暂无评论...
验证码 换一张
取 消