Ruby on rails Rails MVC:表单集合是否应该知道它应该呈现哪些集合记录?

Ruby on rails Rails MVC:表单集合是否应该知道它应该呈现哪些集合记录?,ruby-on-rails,forms,selection,helpers,form-helpers,Ruby On Rails,Forms,Selection,Helpers,Form Helpers,我被一个概念问题困住了。假设Post、标记和用户的[abstracted]设置如下: Post belongs_to Tag Tag has_many Posts User has_many Tags, has_many Posts 用户只能使用其关联的标记之一标记帖子 在新的post表单视图中,我现在有以下选择标记的选项: f.collection\u选择:标签id、当前用户标签等 f.collection\u选择:tag\u id、@tags、并在控制器的新

我被一个概念问题困住了。假设Post、标记和用户的[abstracted]设置如下:

Post  belongs_to Tag
Tag   has_many   Posts
User  has_many   Tags,
      has_many   Posts
用户只能使用其关联的标记之一标记帖子

在新的post表单视图中,我现在有以下选择标记的选项:

  • f.collection\u选择:标签id、当前用户标签等

  • f.collection\u选择:tag\u id、@tags、
    并在控制器的新操作中:

    @tags=当前用户。tags

  • 问题:什么是概念上正确的选项?

    从MVC的角度来看,我肯定倾向于使用第二个选项。视图知道它应该在集合中呈现的标记与用户(更具体地说,是当前用户!)相关联,这似乎是不对的

    然而,在网上和一些网站上,我看到了这样的情况:

    collection_select(:post, :author_id, Author.all, ...)
    
    这显然有利于第一种选择。在这种方法的pro站点上,我不需要在控制器的create操作中重新定义@tags,以防post的save操作失败,并且我想再次呈现新操作


    提前感谢您的建议。

    您的第一个选择没有问题。首先,它更简单(少一行代码)。在控制器中设置一个额外的实例变量并不能真正为您带来任何好处

    考虑控制器的一个好方法是,当变量直接基于只有控制器接收到的输入(例如URL中的参数、查询字符串或来自发布表单的数据)时,它应该只执行设置变量之类的操作

    本例中的视图并不是决定如何确定当前用户,它仍然来自您的控制器(尽管可能继承自顶级应用程序控制器或类似Desive的东西?),它所做的只是决定应该在下拉视图中选择当前用户的标签


    那有用吗?

    是的,确实有用。我会选择第一种选择。谢谢!