【发布时间】:2015-06-14 03:37:35
【问题描述】:
我正在尝试根据当前经过身份验证的用户的属性在我的应用程序主页上做不同的事情。例如:
location, user, state, -> destination
/, no user -> a home page
/, user authenticated, state: unverified -> user profile page
/, user authenticated, state: verified -> a content listing
这看起来是我试图根据当前用户的状态(由状态机表示)“路由”。这 3 个动作已经存在于 3 个不同的控制器中(我称它们为“页面”、“用户”和“帖子”),但是一个可以调用另一个控制器的视图,一个不能调用另一个控制器的动作,这有点困难不要重复自己。有很多方法可以解决这个问题,但我不确定 Rails Way 是什么,所以我想我会问。我认为这是我的选择:
- 在假设的“重定向控制器”中使用 redirect_to,但我希望页面显示在 / 下,所以这不是我想要的。
- 喜欢路由约束(不确定这是否可能;需要路由中可用的会话/cookie,我不确定是否是这种情况)
- 将特定操作的逻辑从它们各自的控制器中提取出来,然后放入 ApplicationController,然后根据用户在假设控制器中的状态直接使用它们(或者只是将其放入页面中)。
- 在控制器、视图或两者中大量重复自己
- 未知的选项,我愿意接受建议。
我倾向于第三个选项,明显的缺点是这些控制器中的某些部分现在或多或少会莫名其妙地存在于 ApplicationController 中(除非,上帝帮助我,我做了某种 Lovecraftian include-on-extend )。把这段代码放在两个地方让我觉得很脏。
我是否遗漏了一些明显的东西?
【问题讨论】:
-
我个人会关心网址(除非我有充分的理由,否则我发现几乎没有人关心您的网址的外观),但这只是我的意见 :-)
-
如果我对这些东西不挑剔,我可能根本不会问任何问题!也许我应该放松一下。 :)
-
Lovecraftian 对 mixins 有何看法?如果您有相同的代码,只需包含 mixin。如果您使用的是 3.1,那么模板继承似乎会让这些事情变得更容易。
-
@bhuga 我应该将其添加为答案吗? ;-)
-
我没有看到模板继承,谢谢。我将看看这里的继承层次结构是否对这个用例有意义......
标签: ruby-on-rails routing state dry