Ruby on rails 作为非MVC开发人员理解MVC体系结构

Ruby on rails 作为非MVC开发人员理解MVC体系结构,ruby-on-rails,model-view-controller,Ruby On Rails,Model View Controller,我在理解MVC架构方面有问题。 并不是说我对MVC一无所知。在MVC架构中,一切对我都有意义,但如果我想开始在MVC架构中开发我的应用程序,我就被卡住了 在编程世界里,基本上有很多方法可以做你想做的事情,但是我想做它应该做的事情。 所以也许有人可以帮我 但我最近遇到的MVC问题是: 我想用RubyonRails写我自己的博客。我想这没什么大不了的。 我会有我的模型,比如文章、评论、用户等等。对于每一个,我都会创建一个控制器来管理它们和所有。 问题是当涉及到管理面板时。我希望一篇文章只能在管理面板

我在理解MVC架构方面有问题。 并不是说我对MVC一无所知。在MVC架构中,一切对我都有意义,但如果我想开始在MVC架构中开发我的应用程序,我就被卡住了

在编程世界里,基本上有很多方法可以做你想做的事情,但是我想做它应该做的事情。 所以也许有人可以帮我

但我最近遇到的MVC问题是:

我想用RubyonRails写我自己的博客。我想这没什么大不了的。 我会有我的模型,比如文章、评论、用户等等。对于每一个,我都会创建一个控制器来管理它们和所有。 问题是当涉及到管理面板时。我希望一篇文章只能在管理面板中创建

那我该怎么办? 我是否应该创建一个管理面板控制器来管理所有只能在管理面板中完成的任务? 否则,我认为对于一个控制器来说太多了

我希望我的URL看起来像这样:

对于管理面板任务:example.com/Admin/article/create 观众:example.com/article/show

(我认为restful Rails的路线看起来不一样,但我认为你得到了我想要的)

在MVC架构中,您将如何完成这项任务?应该如何完成? 您能帮助更好地理解这些MVC任务吗


提前谢谢你。

你所描述的听起来像是一个很好的例子。具体来说,用户身份验证是一个影响许多其他问题的问题。在您的情况下,用户权限会影响文章的发布,但在将来,可以合理地假设它会影响评论控制、添加类别等

在这种情况下,最好在控制器中保留逻辑,以解决主要问题(即创建文章将属于文章控制器),并将身份验证和角色安全转移到控制器都可以使用的附加模块上。这允许您将文章代码集中在单个控制器中,还允许您将来在其他控制器中添加角色级安全性,而无需进行重大重构


Rails中有多种用于身份验证和角色级安全的插件。我会做一些研究,找到一个最适合你的需要。

在创建一个管理区域时要记住的两件事是 1) 您可以为路由创建名称空间,以获取正在查找的/admin URL,并 2) 您可以让控制器从ActionController的其他子代继承

因此,要创建管理区域,您需要在名称空间中声明RESTful资源(假设Rails 3路由):

顶部的集合是公共的,底部的集合为您提供管理路由,如/admin/users/new和/admin/posts/1等。我还假设您可能需要一个“仪表板”,所以我正在设置一个到admin::DashboardController的索引方法的路由

然后创建从ApplicationController派生的管理基础控制器。使用它保存管理区域布局和身份验证过滤器:

class Admin::BaseController < ApplicationController
  before_filter :require_user
  layout 'admin'
end
class Admin::BaseController
现在在app/controllers中创建一个名为“admin”的目录。将其中的控制器设为普通控制器,但要使其从基本控制器继承:

# pages_controller.rb
class Admin::PagesController < Admin::BaseController
  # Controller code in here
end
#pages_controller.rb
类Admin::PagesController
在app/views中为“admin”创建一个对应的目录,你就可以开始了——所有的东西都是以名称空间命名的,视图/控制器的行为就像你想象的那样

您始终可以运行“rake路由”来查看所有管理路由


希望有帮助

我刚刚实现了authlogic,它非常棒,我知道可以设置过滤器,但我认为这样设置并不安全。我错了吗?为了回答您前面的问题,在过滤器之前是的是身份验证模块(如AuthLogic)接受或拒绝发送到特定路由的请求的方式。假设其余部分安装正确,则在控制器中使用before_filter宏来实现实际的网关保护是正确/正常的。谢谢!这对我理解这些分离有很大帮助。我会尝试一下,我会让你知道事情的进展。我按照你的指示做了。在访问lvh.me:3000/admin/websites时,我遇到了以下错误:
路由错误未初始化常量admin::BaseController
,因此我将网站控制器更改为此类
admin::WebsitesController
我遇到了另一个路由错误,我意识到我必须更改视图中的链接。因此,我确实在路径和URL中添加了admin_uu,但现在我得到了另一个错误:
没有与之匹配的路由{:action=>“show”,:controller=>“admin/websites”}
,即使我确实有视图。
# pages_controller.rb
class Admin::PagesController < Admin::BaseController
  # Controller code in here
end