2009-10-12 70 views
3

这似乎是一个的n00b问题,但我想打破一些,我可能已经使用MVC采纳我的不好的做法,所以我希望你能帮助我非CRUD控制器动作

所以,想象我想做一些类似于“上传CSV并解析它”的东西,我觉得它不适合CRUD模式......我没有与数据库交互,所以我不需要添加或更新或删除,但我仍然希望能够从不同的角度以有意义的方式使用该操作。因此,只需一个名为“UploadCSV”的操作即可,并且可通过URL访问,如“/ data/uploadcsv”

您的想法非常感谢!

汤姆

回答

1

这听起来像你正在谈论RESTful的想法(有行动称为索引,创建新的,编辑,更新,销毁显示)。

在MVC中,你可以在任何你想要的地方调用一个动作(所以是的,你可以称它为uploadcsv,如果你愿意的话)。如果您希望它适合RESTful原则,您可能需要考虑动作的作用(例如数据上传本质上是创建或更新功能),并使用其中一个RESTful动作名称命名它。

+0

Michael, 我认为你提出的问题(“它本质上是一个创建还是更新函数”)的含糊性是真正挑战我的。我想,我可以想象,“上传CSV”的操作正在更新假设的“此用户的已上传的数据”,并因此成为我的控制器的上下文。思考的食物!如果你有任何具体的例子,他们会对我很有帮助。 再次感谢。 – thoswarner 2009-10-12 14:56:22

+0

将RESTful名称概念化可能会非常棘手(我当然不是专家)。我相信这一点在铁轨世界中很熟悉。用户登录到一个网站,他们正在创建一个会话。通常使用RESTful/session/create来登录用户,相应地/ session/destroy用于注销。这与CRUD无关。更令人困惑的是,你可以在rails和mvc中使用这些操作,以便/ login和/ logout实际上只是对/ session/create和/ session/destroy的引用。 – 2009-10-12 15:06:42

+1

在创建vs更新的情况下。我(再次没有专家)问自己:“我是否已经获得了这些信息/资源?”如果不是,这是一个创造,如果是这样,那么这是一个更新。使用会话/创建示例:我有一个用户,但在登录之前,他们在应用程序上没有活动会话。因此,我没有使用活动会话的用户概念,所以它的会话/创建不会话/更新。 – 2009-10-12 15:11:25

0

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

+0

感谢您的回复!保留CSV解析示例 - 因此,让我们假设我上传一个CSV文件,其中包含一个标题行字段,然后是任意数据。然后,我想抓取所有标题并将其呈现给用户,以便他们可以在实际导入数据之前选择其字段(导入架构不明确,并且可能因源数据而异)。这是我需要做出决定的地方,“我应该怎样命名我的控制器?”,“我应该使用什么操作来处理初始上传视图”以及“我应该使用什么操作来处理实际上传和解析CSV的操作” .. – thoswarner 2009-10-12 15:08:10

+0

我的问题仍然是 - 此csv是否只包含一种特定类型的数据(表示应用程序中的某种对象)?或者它真的是武断的?我的意思是 - 你(最后)会从这个文件中只填充一种资源,还是会有所不同? – 2009-10-12 15:18:41

+0

在回答你的问题时,数据本身并不代表系统中的资源(汽车列表,用户名等),因为它可以是任何东西。但是,即使实际数据字段没有直接反映原始数据源,数据也是任意的,仍然适合存储资源。因此,你在那里是正确的! 因此,用您提供给我的方式思考它已经回答了我的问题!谢谢! – thoswarner 2009-10-12 15:23:42

0

我相信我和你有同样的观点。

在我的项目中,我尽可能地尽可能地保持宁静。但是正如你说,有时一个特殊的情况下,只是不“适合”

毕竟这也是“感觉” 如果你提供了一个CSV导入功能,我认为这是完全正确的不创建一个完整的REST问题实施CSV。

让我们想象你的应用程序中你有客户。而且你想给客户选择使用csv导入数据。您可以添加路由使用这个动作:

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

这条路线是正确声明,您的“客户”资源完全是宁静的,你有一个附加动作正确申报管理数据输入。

我唯一的警告是:不要使用像这样的路线“/ data/uploadcsv”。从我的角度来看,它缺乏清晰度。我喜欢能够理解我的应用程序将要做什么只是查看网址。而'/ data'对我来说太模糊:)