0

我在这里遇到了一个概念问题。假设 Post、Tag 和 User 的 [abstracted] 设置如下:

Post  belongs_to Tag
Tag   has_many   Posts
User  has_many   Tags,
      has_many   Posts

用户只能使用他的关联标签之一来标记帖子。

在新的帖子表单视图中,我现在有以下用于选择标签的选项:

  1. f.collection_select :tag_id, current_user.tags, ...

  2. f.collection_select :tag_id, @tags,在控制器的新动作中:

    @tags = current_user.tags

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

从 MVC 的角度来看,我绝对倾向于使用第二个选项。视图知道它应该在 collection_select 中呈现的标签与用户相关联似乎并不正确(更具体地说,当前用户!)。

但是,在collection_select 的官方 api 文档和网络上的其他一些 教程中,我看到了这样的内容:

collection_select(:post, :author_id, Author.all, ...)

这显然有利于第一种选择。在这种方法的亲网站上,我不需要在控制器的创建操作中重新定义@tags,以防帖子的保存操作失败并且我想再次呈现新操作。

提前感谢您的建议。

4

1 回答 1

1

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

考虑控制器的一个好方法是,当它们直接基于只有控制器接收的输入(例如 URL 中的参数、查询字符串或来自 POST 表单的数据)时,它应该只做诸如设置变量之类的事情。

在这种情况下,视图并没有决定如何确定当前用户——它仍然来自您的控制器(尽管可能继承自顶级 ApplicationController 或类似 Devise 的东西?),它所做的只是决定它是当前用户应该可以在下拉视图中选择。

这有帮助吗?

于 2011-06-28T21:56:59.630 回答