【问题标题】:Non-CRUD Controller Actions非 CRUD 控制器操作
【发布时间】:2010-12-06 00:20:36
【问题描述】:

这可能看起来像一个 n00b 问题,但我试图打破我使用 MVC 可能采用的一些不良做法,所以我希望你能帮助我

所以,想象一下我想做类似“上传 CSV 并解析它”之类的事情,对我来说将它融入 CRUD 模式似乎并不明显......我没有与数据库交互,所以我不不需要添加、更新或删除,但我仍然希望能够从不同的视图以有意义的方式使用该操作。因此,只需一个名为“UploadCSV”的操作并可以通过诸如“/data/uploadcsv”之类的 URL 访问它是“可以的”

非常感谢您的想法!

汤姆

【问题讨论】:

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


    【解决方案1】:

    听起来您在谈论 RESTful 思想(具有称为索引、创建、新建、编辑、更新、销毁、显示的操作)。

    在 MVC 中,您可以在很大程度上调用任何您想要的操作(所以是的,如果您愿意,您可以将其称为 uploadcsv)。如果您希望它符合 RESTful 原则,您可能需要考虑操作正在做什么(例如,数据上传本质上是创建或更新功能)并使用 RESTful 操作名称之一对其进行命名。

    【讨论】:

    • Michael,我认为你提出的问题的模棱两可(“它本质上是创建还是更新功能”)是真正挑战我的地方。我想,我可以想象“上传 CSV”的操作正在更新内存中保存的假设的“此用户上传的数据”,因此这将是我的控制器的上下文。值得深思!如果你有任何具体的例子,它们将对我有很大的帮助。再次感谢。
    • 将 RESTful 名称概念化可能很棘手(我当然不是专家)。这个,我相信,在铁路世界里很熟悉。用户登录到一个站点,他们正在创建一个会话。然后通常使用 RESTful /session/create 来登录用户,相应地 /session/destroy 用于注销。这与 CRUD 无关。更令人困惑的是,您可以在 rails 和 mvc 中为这些操作设置别名,以便 /login 和 /logout 实际上只是对 /session/create 和 /session/destroy 的引用。
    • 在创建 vs 更新的情况下。我(再一次,不是专家)问自己“我已经得到这些信息/资源了吗?”如果不是,它是一个创建,如果是,那么它是一个更新。使用会话/创建示例:我确实有一个用户,但在登录之前,他们在应用程序上没有活动会话。因此,我没有具有活动会话的用户的概念,因此它是会话/创建而不是会话/更新。
    • 很好的例子 - 我在学习 Rails 时遇到了这个问题,让我想“我可能不会想到这一点,但当我现在想到它时就很明显了!”米兰留下了一些关于将这些模糊性分解为具体概念的好方法,即使这意味着你必须将你正在做的事情分解成比你“需要”更多的行动。
    【解决方案2】:

    资源的持久性在这里并不重要。我想你在这里做的是 - 从提供的 csv 中创建某种资源(尽管不是持久的)。这里的事情是考虑这个 csv 文件代表什么。里面是什么?它会成为系统中资源的集合,还是仅代表系统中的一个对象?如果您考虑一下,它必须是具体的东西。您能否更具体地说明您的问题领域?

    【讨论】:

    • 感谢您的回复!与 CSV 解析示例保持一致 - 因此,假设我上传了一个 CSV 文件,其中包含标题行字段,然后是任意数据。然后我想获取所有标题并将它们呈现给用户,以便他们可以在实际数据导入发生之前选择他们的字段(导入模式不明确,并且可能因源数据而异)。这是我需要做出决定的地方:“我应该为控制器命名什么?”、“我应该使用什么操作来处理初始上传视图”和“我应该使用什么操作来处理 CSV 的实际上传和解析” ..
    • 我的问题仍然是 - 这个 csv 是否只包含一种特定类型的数据(代表应用程序中的某种对象)?还是真的很随意?我的意思是——你(最后)是要从这个文件中只填充一种资源还是可以变化?
    • 在回答您的问题时,数据本身并不代表系统中的资源(汽车列表、用户名等),因为它实际上可以是任何东西。但是数据,无论多么随意,仍然适合存储它的资源,即使实际数据字段不直接反映原始数据源。因此,你是对的!因此,以您提供给我的术语来思考它已经回答了我的问题!谢谢!
    【解决方案3】:

    相信我的观点和你一样。

    在我的项目中,我尽可能保持安静。但是,正如您所说,有时特殊情况并不“适合”

    毕竟也是“感觉”的问题 如果您提供 csv 导入功能,我认为不为 CSV 创建完整的 REST 实现是完全正确的。

    让我们假设在您的应用程序中有客户。您还可以为客户提供使用 csv 导入数据的选项。您可以使用以下方式为此操作添加路线:

    map.resources :clients, :member => { :uploadcsv => :get }
    

    路由已正确声明,您的“客户”资源完全安静,并且您有一个正确声明的附加操作来管理数据导入。

    我唯一的警告是:不要使用像“/data/uploadcsv”这样的路由。从我的角度来看,它缺乏清晰度。我希望能够通过查看 url 来了解我的应用程序将要做什么。 '/data' 对我来说太模糊了 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2022-12-14
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      相关资源
      最近更新 更多