【发布时间】:2012-01-31 18:44:03
【问题描述】:
免责声明:使用 Rails 开发的第一个月,但我已经阅读了我能找到的所有内容。
编辑:不知何故,我错过了 this very similar question 并给出了类似的最终答案。
我有多态标志:
Class Flag...
belongs_to :flaggable, :polymorphic => true
...
end
我有嵌套资源,这些资源具有适当的 has_many :flags, :as => :flaggable 语句。
resources :posts do
resources :comments
end
我希望帖子和 cmets 以及将来网站上的其他内容都可以标记。 关于路由和控制器的 DRY/标准方式(我使用的是 Rails 3.1)是什么?
我为路线做了什么:
主要基于 this rails cast,我将标志作为帖子和 cmets 的嵌套资源。已经,我认为我走错了路,因为它似乎是在重新陈述模型中的多态关系以及违反"Resources should never be nested more than 1 level deep." 的指导方针
resources :posts do
resources :flags
resources :comments do
resources :flags
end
end
另外,我想单独实现可标记的路由,如下所示。但同样,这似乎并不 DRY,并且还为 cmets 生成了不想要的独立路由。
resources :posts do
resources :flags
end
resources :comments do
resources :flags
end
最后,我想知道是否可以为可标记物制作通用资源。我找不到任何方法来实现这一点,并且它与之前为通用可标记类型提供通用路由的方法存在相同的问题。
resources :flaggable do
resources :flags
end
我为上面嵌套资源的控制器做了什么:
我实现了 find_flaggable,但意识到对于嵌套资源,转换为可标记类的参数可能是 Post 或 Comment,因为两者都以参数(post_id 和 comment_id)结尾。我可以使用当前设置的 id 优先级列表来解决以下问题,但这不是一个通用的解决方案,它甚至比现在的 DRY 还要少。
def find_flaggable
params.each do |name, value|
if name =~ /(.+)_id$/
return $1.classify.constantize.find(value)
end
end
nil
end
所以这就是我停下来的地方(实际上只为帖子和评论实施了一个有限的解决方案)并意识到我不知道一个令人满意的方法来实现这一点。有人可以帮忙吗?
【问题讨论】:
标签: resources ruby-on-rails-3.1 routes polymorphism