我正在尝试使用此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的新手,无法为此错误找到合适的解决方案。
答案 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