Ruby on Rails抱怨Active Record中内置的方法不存在。什么?

时间:2010-05-12 19:00:09

标签: ruby-on-rails ruby rubygems

我正在浏览Rails中的一些基本指南,回顾基础知识 等即将到来的考试。其中一个指南包括 在guide.rubyonrails.org上的标准入门指南。 如果需要,可以使用以下链接。我的所有代码都是针对我的应用程序的 从那里开始,所以我发布任何代码都没有问题 应该与那里显示的相同。我没有复制粘贴,但我 基本上是在屏幕的一半和网络上用Vim打字 在另一半的页面,键入我看到的内容。

http://guides.rubyonrails.org/getting_started.html

就像我说的那样,当我注意到过去时,我会沿着指南走 在教程中的某一点,我总是得到一个错误 现场。要查找代码部分,只需按页面上的Ctrl + f(或 无论你有什么搜索/找到设置为)并输入“accepts_”。这个 应立即引导您进入这一段代码。

class Post < ActiveRecord::Base
  validates_presence_of :name, :title
  validates_length_of :title, :minimum => 5
  has_many :comments
  has_many :tags

  accepts_nested_attributes_for :tags, :allow_destroy => :true  ,
   :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
end

所以我尝试将它放在我的代码中。它在 〜/ Rails / blog / app / models / post.rb万一你想知道。然而, 即使在我在指南中提到的所有其他代码之后,也希望如此 我只是错过了一些代码,这些代码将在稍后出现 指南。但每次都没有,同样的错误。这就是我得到的。


  PostsController #index 中的

NoMethodError      

undefined方法`accepts_nested_attributes_for'代表#&lt; Class:0xb7109f98&gt;

     

/usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/base.rb:1833:in   `method_missing的”   应用程序/模型/ post.rb:7   app / controllers / posts_controller.rb:9:在`index'

     

请求

     

参数:

     

     

响应

     

页眉:

     

{ “内容类型”=&gt; “中”,    “曲奇”=&GT; [],    “缓存控制”=&gt; “中无缓存”}


现在,我从指南中复制了上述代码。这两个代码部分我 在错误消息中提到的我将在下面粘贴。


class PostsController < ApplicationController
  # GET /posts
  # GET /posts.xml

  before_filter :find_post,
    :only => [:show, :edit, :update, :destroy]

  def index
    @posts = Post.find(:all) # <= the line 9 referred to in error message

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

class Post < ActiveRecord::Base
  validates_presence_of :name, :title
  validates_length_of :title, :minimum => 5
  has_many :comments
  has_many :tags

  accepts_nested_attributes_for :tags, :allow_destroy => :true  , # <= problem
    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
end

此处还有宝石本地宝石清单。我注意到它们有点过时了,但默认的Rails安装任何学校机器(可能是我考试的环境)基本上是'gem install rails --version 2.2.2',因为它们是windows机器,它们带有ruby安装程序附带的所有普通Windows红宝石宝石。但是,我正在使用我的Debian虚拟机运行它,但是试图将它设置为类似,我认为windows ruby​​ gems不会改变Rails中的任何内容。

*** LOCAL GEMS ***

actionmailer (2.2.2)
actionpack (2.2.2)
activerecord (2.2.2)
activeresource (2.2.2)
activesupport (2.2.2)
gem_plugin (0.2.3)
hpricot (0.8.2)
linecache (0.43)
log4r (1.1.7)
ptools (1.1.9)
rack (1.1.0)
rails (2.2.2)
rake (0.8.7)
sqlite3-ruby (1.2.3)

2 个答案:

答案 0 :(得分:3)

如果您查看http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for,您会看到accepted_nested_attributes_for仅在Rails 2.3.2之后存在,所以如果您的2.2版本运行,我担心您将无法使用该功能。

答案 1 :(得分:1)

您必须升级到2.3.2或更高,因为Antonio建议。我建议使用2.3.5。您可以升级系统上的gem,也可以将Rails冻结到您的应用程序。

升级宝石

gem install rails -v=2.3.5

冻结Rails

cd /your/app/
git clone git://github.com/rails/rails vendor/rails
cd vendor/rails
git checkout v2.3.5