【发布时间】: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