【问题标题】:Understanding MVC architecture as non-MVC-developer将 MVC 架构理解为非 MVC 开发人员
【发布时间】:2011-03-30 23:13:51
【问题描述】:

我在理解 MVC 架构方面存在问题。 并不是我对MVC一无所知。在 MVC 架构中,一切对我来说都是有意义的,但如果我想开始在 MVC 架构中开发我的应用程序,我就会陷入困境。

在编程世界中,基本上有很多方法可以做你想做的事,但我想按照它应该做的那样去做。 所以也许有人可以帮助我。

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

我想用 Ruby on Rails 编写自己的博客。我认为这没什么大不了的。 我会有我的模型,比如文章、cmets、用户等等。对于它们中的每一个,我都会创建一个控制器来管理它们。 问题在于管理面板。我希望文章只能在管理面板中创建。

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

我希望我的网址看起来像这样:

对于管理面板任务:example.com/admin/article/create 观看者:example.com/article/show

(我认为宁静的 Rails 路线看起来不同,但我认为你得到了我想要的)

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

提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails model-view-controller


    【解决方案1】:

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

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

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

    【讨论】:

    • 我刚刚实现了 authlogic,它很棒,我知道你可以设置之前的过滤器,但我认为这样设置它并不是很安全。我错了吗?
    【解决方案2】:

    创建管理区域时要记住的两件事是 1) 你可以为路由创建命名空间来获取你正在寻找的 /admin URLs 2) 你可以让控制器继承自 ActionController 的其他后代

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

    # routes.rb
    resources :users
    resources :posts
    resources :pages
    
    namespace :admin do |admin|
      match '/' => 'dashboard#index'
      resources :users
      resources :posts
      resources :pages
    end
    

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

    然后您创建一个从 ApplicationController 继承的管理基础控制器。用它来保存您的管理区域布局和您的身份验证过滤器:

    class Admin::BaseController < ApplicationController
      before_filter :require_user
      layout 'admin'
    end
    

    现在在 app/controllers 中创建一个名为“admin”的目录。像往常一样在其中制作控制器,但让它们从您的基本控制器继承:

    # pages_controller.rb
    class Admin::PagesController < Admin::BaseController
      # Controller code in here
    end
    

    在 app/views 中为“admin”创建一个相应的目录,一切顺利 - 一切都已命名空间,并且视图/控制器的行为与您想象的一样。

    您可以随时运行“rake routes”来查看所有管理员路由。

    希望有帮助!

    【讨论】:

    • 回答您之前的问题,是的 before_filters 是身份验证模块(如 AuthLogic)尊重或拒绝发送到特定路由的请求的方式。假设其余部分安装正确,在控制器中使用 before_filter 宏来实现实际的守门是正确/正常的。
    • 谢谢!这对我理解这些分离有很大帮助。我会尝试一下,我会告诉你进展如何。
    • 我听从了你的指示。当转到 lvh.me:3000/admin/websites 时出现此错误:Routing Error uninitialized constant Admin::BaseController 所以我将 WebsitesController 更改为此类 Admin::WebsitesController &lt; ApplicationController 我遇到了另一个路由错误,我意识到我必须更改视图中的链接。所以我确实将 admin_ 附加到路径和 url,但现在我得到了另一个错误:No route matches {:action=&gt;"show", :controller=&gt;"admin/websites"} 即使我确实有视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2012-04-19
    • 2014-02-26
    相关资源
    最近更新 更多