带有 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 中工作