2011-04-06 30 views
2

我遇到了有关Rails 3和新routes.rb一般结构性问题让我有点困惑。感谢您的帮助或指导。Rails 3嵌套用户资源(设计)结构

我有一个嵌套资源的论坛应用程序。有部分,主题和答复。在routes.rb中的结构是这样的:

resources :sections do 
    resources :topics do 
    resources :replies 
    end 
end 

我section.rb:

has_many :topics 
    has_many :replies, :through => :topics 

我topic.rb:

belongs_to :section 
    has_many :replies 

我reply.rb:

belongs_to :topic 

这是奇妙的工作。现在,这是我困惑的地方。

我添加了一个使用Devise的用户控制器,并有一个可用的用户名登录/注销系统。我试图将“current_user”与答复和主题连接起来。我认为我对如何修复这些模型有了一个好主意,但是我对route.rb文件中的操作感到困惑。

对于user.rb,我相信我需要添加“has_many:topics”和“has_many:回复,:through =>:topics”。然后在我的主题中,我需要添加“belongs_to:user”。我相信reply.rb保持不变?

至于routes.rb我有点难住。如果我编辑路线并添加用户,我会得到像sectionid/username/topicid /这样的路径,但我不一定需要在类似的路线中存储用户名。因此,我要将用户嵌入部分和主题之间,或者我可以将用户从routes.rb文件中取出。

回答

2

您可以让用户离开路径。只需将devise_for:用户放在路由之上,而不将其包含在资源块中。

用户有很多话题,并且有很多回复。主题和答复都属于用户。

您的控制器需要更多更改。您需要添加一个before_filter来检查用户是否已通过身份验证,并在大多数控制器方法中进行更改,以检查用户是否仅通过了身份验证,但是也是经过授权的,例如,对于编辑查找,您可以执行current_user.replies ....你可以在这里阅读更多(我自己的网页):http://www.communityguides.eu/articles/4

+0

因此,在我的主题控制器,当我创建,我在哪里设置其用户?我是否会做一个before_filter,并且有一个方法会变为'@user = current_user',并在创建新主题时保存用户?或者我需要编辑创建方法? – a3uge 2011-04-06 13:38:58

+0

我认为我必须做类似... @topic = section.current_user.topics.build(params [:topic])...但显然不起作用,因为current_user不是section的属性。 – a3uge 2011-04-06 13:48:25

+0

current_user是Devise的助手。如果没有用户登录,并且用户对象(如果用户已登录),则为零。在您之前的过滤器中,您需要如下所示:before_filter:authenticate_user !,:except => [:index]。这需要登录此控制器的所有方法(索引除外)。看看我的链接(和本教程的其他章节)。 – 2011-04-06 15:04:49