Rails - 模块论坛中未定义方法“all”。

3

我正在尝试使用这个页面的教程(页面链接)实现一个论坛页面!在这里,论坛是一个模型(model)。以下是控制器(controller)代码:

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的新手,无法找到适当的解决方案来解决这个错误。


1
请提供您的论坛模型源代码。 - Alexander Kobelev
1
重做第4步。论坛不是一个模块,而是app/models中的一个模型。 - TheIrishGuy
@ThelrishGuy 对于问题中的错误我感到抱歉,我已按照规定进行了更正。 - trialError
@AlexanderKobelev,我已经提供了论坛模型源代码。 - trialError
5个回答

5
上述错误提示说没有为模块“Forum”定义方法。然而,“Forum”的定义明显显示它是一个类,而不是模块。
唯一的解释是你的应用程序中有另一个定义为模块的“Forum”定义,在模型加载之前被加载并与你的应用程序冲突。
请非常小心,确保你没有将你的应用程序命名为“Forum”,否则主应用程序命名空间将与你的模型发生冲突(很可能就是问题所在)。 在这种情况下,你要么重命名你的应用程序,要么(更容易)重命名模型。实际上,应用程序命名空间被定义为模块。
搜索你的应用程序源代码中是否有“Forum”模块定义,并将其移除。它也可能在一个gem中(非常不太可能,但不是不可能),因此请确保你了解你使用的依赖项的源代码。

1
将应用程序和控制器命名为相同的名称,某种程度上,来自will的类将被解释为模型。your_class.class 应该返回“Class”。我没有太多经验,但这就是我注意到的。删除应用程序并使用相同的方法但不同的名称重新构建它可以起作用。希望能有所帮助。

是的,当我将我的应用程序重命名为与我的模型名称不同的名称时,它开始正常工作。 - keineahnung2345

1
这可能与你的路由有关。请在config/routes.rb中尝试:root :to => 'forums#index',而不是map.root :controller => 'forums'。这是Rails 2/3的事情,我认为这个教程是写在2上的。如果你想学习Rails,我推荐Michael Hartl的Rails教程

1
嘿,我之前已经做了那个更改,但最终仍然出现了相同的错误。 - trialError
是的,我认为Simone说得对。很可能已经定义了一个论坛模块。 - Colto

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

0

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

例如:

app/controllers/communication

app/models/communication.rb

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