【问题标题】:"undefined method `model_name' for NilClass:Class" with CarrierWave带有 CarrierWave 的“NilClass:Class 的未定义方法‘model_name’”
【发布时间】: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

问候,伊万

【问题讨论】:

  • 您的迁移等是否排序正常?
  • 是的,我已经进行了迁移。

标签: ruby-on-rails upload photos carrierwave


【解决方案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://stackoverflow.com/a/21992187/3280686

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多