3

我正在尝试使用此页面中的教程来实现论坛页面!这里的论坛是一个模型。这是控制器代码:

class ForumsController < ApplicationController
  before_filter :admin_required, :except => [:index, :show]

  def index
    @forums = Forum.all
  end

  def show
    @forum = Forum.find(params[:id])
  end

  def new
    @forum = Forum.new
  end

  def create
    @forum = Forum.new(params[:forum])
    if @forum.save
      redirect_to @forum, :notice => "Successfully created forum."
    else
      render :action => 'new'
    end
  end

  def edit
    @forum = Forum.find(params[:id])
  end

  def update
    @forum = Forum.find(params[:id])
    if @forum.update_attributes(params[:forum])
      redirect_to @forum, :notice  => "Successfully updated forum."
    else
      render :action => 'edit'
    end
  end

  def destroy
    @forum = Forum.find(params[:id])
    @forum.destroy
    redirect_to forums_url, :notice => "Successfully destroyed forum."
  end
end

错误是:

undefined method `all' for Forum:Module

这是论坛模型(models/forum.rb):

class Forum < ActiveRecord::Base
  attr_accessible :name, :description
  has_many :topics, :dependent => :destroy

  #method to find the most recent forum topics
  def most_recent_post  
  topic = Topic.first(:order => 'last_post_at DESC', :conditions => ['forum_id = ?', self.id])  
  return topic  
end  
end

我该如何纠正这个错误?我是 ROR 新手,无法找到解决此错误的正确方法。

4

5 回答 5

5

上面的错误是说没有为Module Forum. 但是,定义Forum清楚地表明这是一个类,而不是一个模块。

唯一的解释是,您在应用程序的某个地方对 Forum 有另一个定义,您将其定义为 a Module,它在模型之前加载,并且与您的应用程序冲突。

小心你没有调用你的应用程序Forum,否则主应用程序命名空间将与你的模型冲突(很有可能是问题所在)。在这种情况下,您可以重命名您的应用程序或(更简单)模型。实际上,应用程序命名空间被定义为模块。

在应用程序的源代码中搜索论坛模块定义并将其删除。它也可能在 gem 中(非常不可能,但并非不可能),因此请确保您知道您正在使用的依赖项的源代码。

于 2013-10-22T12:55:30.870 回答
1

这可能与您的路线有关。

试穿config/routes.rb

root :to => 'forums#index'

代替

map.root :controller => 'forums'

这是一个 rails 2/3 的东西,我认为本教程是用 2 编写的。

如果您正在尝试学习 Rails,我推荐Michael Hartl 的 Rails 教程

于 2013-10-21T20:55:51.667 回答
1

以相同的名称命名应用程序和控制器,不知何故,来自的类将被解释为模型。your_class.class 应该返回“类”。我没有太多经验,但这就是我注意到的。删除应用程序并使用相同的方法但不同的名称再次构建它有效。希望它会有所帮助。

于 2019-11-28T12:21:43.337 回答
0

我遇到了这个问题,因为我在其中创建了一个app/controllers与模型同名的目录。删除目录解决了这个问题。

例如:

app/controllers/communication
app/models/communication.rb
于 2020-04-16T17:20:04.363 回答
0

主要原因是您将 Rails 应用程序生成为论坛。当您这样做时,数据库名称将成为论坛,更重要的是,/config/application.db 中的应用程序模块也将被称为论坛,这就是混淆的地方。要解决此问题,请转到您的 config/application.rb 并将模块名称更改为例如:ForumApp 并对数据库执行相同操作,尽管这不是必需的。

于 2022-01-31T17:12:58.383 回答