СУХАЯ маршрутизация для одного полиморфного ресурса с вложенными ресурсами - PullRequest
1 голос
/ 08 марта 2012

Учитывая следующие модели:

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|

Но это выглядит невероятно неуклюжим, должен быть лучший способ.

1 Ответ

0 голосов
/ 08 марта 2012

Легко решается путем передачи URL ресурса в форму:

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