【问题标题】:Rails MVC: Should a form collection_select know which collection records it should render?Rails MVC:表单 collection_select 是否应该知道它应该呈现哪些集合记录?
【发布时间】:2011-06-28 21:19:48
【问题描述】:

我有点陷入概念性问题。假设 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 中呈现的标签与用户相关联,这似乎是不对的(更具体地说,是当前用户!)。

但是,在网络上的official api documentation for collection_select 和一些other tutorials 中,我看到了这样的内容:

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

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

提前感谢您的建议。

【问题讨论】:

    标签: ruby-on-rails forms selection helpers form-helpers


    【解决方案1】:

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

    考虑控制器的一个好方法是,当它们直接基于只有控制器接收的输入(例如 URL 中的参数、查询字符串或来自 POST形式)。

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

    这有帮助吗?

    【讨论】:

    • 是的,这确实有帮助。我会选择第一个选项。非常感谢!
    猜你喜欢
    • 2014-09-19
    • 2020-04-29
    • 2016-01-21
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-05-20
    相关资源
    最近更新 更多