我在这里遇到了一个概念问题。假设为帖子,标签和用户设置了[抽象]设置:
Post belongs_to Tag
Tag has_many Posts
User has_many Tags,
has_many Posts
用户只能使用其中一个相关标签标记帖子。
在新的帖子表单视图中,我现在有以下选项来选择标记:
f.collection_select :tag_id, current_user.tags, ...
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, ...)
显然有利于第一种选择。在这种方法的pro-site上,我不需要在控制器的create动作中重新定义@tags,以防post的保存操作失败并且我想再次渲染新动作。
提前感谢您的建议。
答案 0 :(得分:1)
你的第一个选择没有错。对于初学者来说,它更简单(少一行代码)。在你的控制器中设置一个额外的实例变量并没有真正获得任何东西。
考虑控制器的一个好方法是,它应该只是在设置变量时直接根据只有控制器接收的输入(例如URL中的参数,查询字符串或来自POST的数据)来执行操作形式)。
在这种情况下的视图不是决定如何确定当前用户 - 仍然来自你的控制器(尽管可能继承自顶级ApplicationController或类似Devise?),它所做的就是决定它是当前用户的标签,应该可以在下拉视图中选择。
这有帮助吗?