rails - undefined方法全部用于论坛:模块

时间:2013-10-21 19:42:38

标签: ruby-on-rails ruby ruby-on-rails-3

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

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 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

这可能与您的路线有关。

试试config/routes.rb

root :to => 'forums#index'

而不是

map.root :controller => 'forums'

这是一个2/3的轨道,我认为本教程是用2写的。

如果您正在尝试学习Rails,我建议Michael Hartl's Rails Tutorial

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

例如:

app/controllers/communication
app/models/communication.rb