【问题标题】:DRY routing for one polymorph resource with nested resources具有嵌套资源的一个多态资源的 DRY 路由
【发布时间】:2012-03-08 11:47:35
【问题描述】:

鉴于以下模型:

class Blog < ActiveRecord::Base
  has_many :posts
end

class SiteBlog < Blog
end

class ProjectBlog < Blog
end

class Post <ActiveRecord::Base
  belongs_to :blog
end

还有以下路线:

resources :blogs do
  resources :posts
end

如果是部分表单,如果@blog 是博客,则以下内容可以正常工作:

form_for [@blog, @post] ...

但是,如果 @blog 是 ProjectBlog 或 SiteBlog,它会爆炸,因为它会寻找 URL 帮助程序,例如 project_blog_posts。

我想这样的事情会解决这个问题:

[:project_blogs, :site_blogs].each |blogs| do
  resources blogs do
    resources :posts
  end
end

我想知道是否有办法使用子类模型(例如 ProjectBlog)的路由来使用父模型(博客)的路由。 "as" 选项只处理像 [@blog, @post] 一样传递给 form_for 的 last 对象。

更新

根据以下要求,以下是路线:

resources :blogs, only: [:show] do
  resources :posts, only: [:new, :create, :edit, :update]
end

               blog_posts POST   /blogs/:blog_id/posts(.:format)                         posts#create
            new_blog_post GET    /blogs/:blog_id/posts/new(.:format)                     posts#new
           edit_blog_post GET    /blogs/:blog_id/posts/:id/edit(.:format)                posts#edit
                blog_post PUT    /blogs/:blog_id/posts/:id(.:format)                     posts#update
                     blog GET    /blogs/:id(.:format)                                    blogs#show

更新 2:

来自以下答案的提示:

form_for [@blog, @post], url: blog_posts_path(@blog, @post) do |f|

这仅适用于“新”操作,对于“编辑”操作,我会得到 - 正如预期的那样 - 一个错误的 URL:

params[:action]   # => "edit"
blog_posts_path(@blog, @post)   # => "/blogs/publikationsreihe-tafelrunde/posts.5"

所以我提到的“如果”可以解决这个问题:

form_for [@blog, @post], url: params[:action]=='new' ? blog_posts_path(@blog, @post) : blog_post_path(@blog, @post) do |f|

但这看起来非常笨拙,一定有更好的方法。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes actionpack


    【解决方案1】:

    通过将资源 url 传递给表单很容易解决:

    <%= form_for [@blog, @post], :url => blog_posts_path(@blog, @post) do |f| %>
      ...
    <%- end %>
    

    【讨论】:

    • 我试过了,但是这个硬编码的 URL 只适用于新记录。使用相同的表单进行编辑会触发“无路由匹配 [PUT] /blogs/123/posts”错误。如果可以解决此问题,但应该有一种不那么丑陋的方法。
    • 听起来你的 routes.rb 是错误的。嵌套的博客/帖子资源应提供用于更新帖子的确切 PUT 资源。你能告诉我们“rake routes”的输出吗?
    • 好吧,您不应该使用 PUT 路由到 /blogs/123/posts。它应该是 /blogs/123/posts/ ...并且刚刚看到我的错误。试试我上面的更新链接...我在 blog_posts url 帮助程序中缺少 @post 对象。
    • 我不使用 PUT 路由 /blogs/123/posts。 AFAIK blog_posts_path 助手不适合编辑(请参阅上面的更新 2)。
    • 您是为这些模型使用单表继承,还是有 site_blogs 和 project_blogs 表?另外,为什么需要在模型级别区分它们?
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多