Учитывая следующие модели:
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.
Обновление
Как указано ниже, вот маршруты:
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|
Но это выглядит невероятно неуклюжим, должен быть лучший способ.