在安装PaperClip时为什么会出现“undefined method for 'has_attached_file'”错误?

53

我刚刚安装了Paperclip插件,但是我收到了以下错误信息,我不确定原因是什么:

NoMethodError (undefined method `has_attached_file' for #<Class:0x10338acd0>):
  /Users/bgadoci/.gem/ruby/1.8/gems/will_paginate-2.3.12/lib/will_paginate/finder.rb:170:in `method_missing'
  app/models/post.rb:2
  app/controllers/posts_controller.rb:50:in `show'

这段代码引用了will_paginate gem。据我所知,可能是我的PostsController#index有问题,或者之前尝试安装gem而不是插件时出现了问题,在这种情况下,我应该通过某种方式在/config/environments.rb文件中解决问题。

我原本认为之前安装的gem不会有影响,因为我是在一个旧版的网站上安装的,然后将其删除并安装了插件。在当前版本的网站中,经过迁移后已经更新了带有Paperclip列的表。以下是我的代码:

PostsConroller#show:

  def show
    @post = Post.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

帖子模型:

class Post < ActiveRecord::Base

  has_attached_file :photo
  validates_presence_of :body, :title
  has_many :comments, :dependent => :destroy
  has_many :tags, :dependent => :destroy
  has_many :votes, :dependent => :destroy
  belongs_to :user
  after_create :self_vote
      def self_vote
       # I am assuming you have a user_id field in `posts` and `votes` table.
       self.votes.create(:user => self.user)
      end

  cattr_reader :per_page 
    @@per_page = 10

end

/views/posts/new.html.erb:

<h1>New post</h1>
<%= link_to 'Back', posts_path %>
<% form_for(@post, :html => { :multipart => true}) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.file_field :photo %>
  </p>

  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

错误来自于PostsController的“show”方法,但是你把“index”方法和“new”视图的内容粘贴在那里了?整理一下你的问题,包括相关信息,这样更有可能有人能帮助你解决问题。 - jdl
1
此外,我几乎可以保证最大的线索是错误引用了类而不是帖子。一旦我们看到实际失败的代码,这应该是相当明显的。 - jdl
刚刚更新了show方法。对此感到抱歉,我还是个新手。感谢您的指导。 - bgadoci
5个回答

183

在安装新的宝石/插件后,重新启动服务器非常重要。这应该可以解决你的问题。


我的问题也被解决了,而且也是与 Mongrel 有关...我不习惯使用它,所以我猜当你改变插件和/或配置时,你需要经常重新启动它。 - pjammer
不得不重新启动我的控制台,重新加载也不起作用。 - Anjan

8
我建议安装paperclip gem。然后您只需要将config.gem 'paperclip'添加到您的environment.rb中并运行sudo rake gems:install

你好..我正在使用Rails 2.0.2和ruby 1.8.7,但我仍然面临这个错误。我已经在我的environment.rb文件中添加了require "paperclip",并安装了paperclip 2.3.8作为我的activerecord,而activesupport的版本是2.0.2。有什么建议可以修复这个问题吗?是否有任何方法可以获取paperclip插件的替代品?因为我使用的是较旧的rails版本,而插件仍然有效。我听说thoughtbot已经关闭了他们的svn仓库,我是否可以通过github获取它? - boddhisattva
@boddhisattva 只需像这样更新您的gemfile:gem 'paperclip',:git => "git://github.com/thoughtbot/paperclip.git" - Gerard
@Gearóid:谢谢,但我在发布这个问题时正在进行一个Rails 2.0.x项目。对我起作用的解决方法是我必须找到一个与我所使用的Rails版本兼容的paperclip提交。 - boddhisattva
你真的不应该使用'sudo'来安装gems。 - RonLugge

2

在config/initializers目录下创建文件paperclip.rb

添加以下内容并重启服务器

require "paperclip/railtie"

Paperclip::Railtie.insert


1

在 Paperclip 工作良好数周后,我在两台不同的开发机上突然遇到了此错误。

spring stop

需要重新启动我的 Rails 控制台。


0

我想这应该是显而易见的,但我正在使用mongo/mongoid作为我的数据层,并需要安装mongoid paperclip才能使其正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接