带有 CarrierWave 的“NilClass:Class 的未定义方法‘model_name’”

Posted

技术标签:

【中文标题】带有 CarrierWave 的“NilClass:Class 的未定义方法‘model_name’”【英文标题】:"undefined method `model_name' for NilClass:Class" with CarrierWave 【发布时间】:2011-09-21 06:52:22 【问题描述】:

现在我正在使用 CarrierWave 将照片上传到我的网站。问题是当我打开照片/上传 (upload.html.erb) 时显示此错误:

未定义的方法`model_name' NilClass:类

在我的 upload.html.erb 的第 1 行附近:

<%= 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 %>  

我不太明白这一点,因为我认为我的模型(photos.rb)没有错误:

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

在我的 photos_controller.rb 我有这个:

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

这是我的 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

问候,伊万

【问题讨论】:

您的迁移等是否排序正常? 是的,我已经进行了迁移。 【参考方案1】:

问题可能与您已将上传程序安装为:photos,但表单字段为:photo 这一事实有关。尝试使这些匹配。

【讨论】:

是的,一个小错误,抱歉。但是,当我将 :photo 更改为 :photos 时,错误继续存在。我会继续寻找错误。 另外,你的模型被命名为Photos,实际上应该命名为Photo。按照惯例,模型名称在 Rails 中是单数的,这可能是它找不到正确模型的原因。当我试图寻找不一致时,这也让一切变得更加混乱。尝试更改此设置并更新您的问题以匹配。 卢克眼睛好。至于字段,他已经正确定义了它们attr_accessor :gallery_id, :name, :photo。是的,模型必须是单数的。 这可能无法解决问题,但它会让我们更好地了解错误可能是什么。【参考方案2】:

可以通过实例化对象照片对象来解决问题。我认为这应该可以解决问题。

【讨论】:

【参考方案3】:

我回答得晚了,因为可以看到照片控制器中没有与模板 upload.html.erb 匹配的上传操作

我建议你将其重命名为 new.html.erb 并尝试访问 url 'photos/new'

【讨论】:

【参考方案4】:

我遇到了同样的问题,搜索让我得到了这个答案 https://***.com/a/21992187/3280686

您需要将此添加到您的Class PhotosUploader

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

【讨论】:

以上是关于带有 CarrierWave 的“NilClass:Class 的未定义方法‘model_name’”的主要内容,如果未能解决你的问题,请参考以下文章

由于跨域请求,带有 Jquery 文件上传的 Carrierwave_Direct 不会重定向

ruby CarrierWave带有来自雾的备用URL,快速而肮脏。对于将生产数据提取到开发中非常有用,以防万一你必须全力以赴

Carrierwave、MiniMagick 和调整图像大小

Rails 5可操作的未定义方法'fetch'用于nil:NilClass

升级到 Rails 4.2.5.1 后 nil:NilClass 的未定义方法“缓存”

Rails:上传 dropzone、S3、carrierwave,不能在 Safari 中工作,但在 Google Chrome 中工作