Rails MVC:表单collection_select应该知道它应该呈现哪些集合记录吗?

时间:2011-06-28 21:19:49

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

我在这里遇到了一个概念问题。假设为帖子,标签和用户设置了[抽象]设置:

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

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

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

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

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

    显然有利于第一种选择。在这种方法的pro-site上,我不需要在控制器的create动作中重新定义@tags,以防post的保存操作失败并且我想再次渲染新动作。

    提前感谢您的建议。

1 个答案:

答案 0 :(得分:1)

你的第一个选择没有错。对于初学者来说,它更简单(少一行代码)。在你的控制器中设置一个额外的实例变量并没有真正获得任何东西。

考虑控制器的一个好方法是,它应该只是在设置变量时直接根据只有控制器接收的输入(例如URL中的参数,查询字符串或来自POST的数据)来执行操作形式)。

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

这有帮助吗?