次のモデルがあるとします。
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 の場合は、project_blog_posts などの URL ヘルパーを検索するため、爆撃します。
私はこのような何かがこれを解決すると思います:
[:project_blogs, :site_blogs].each |blogs| do
resources blogs do
resources :posts
end
end
サブクラス化されたモデル (ProjectBlog など) のルートを使用して、親モデル (Blog) のルートを使用する方法があるかどうか疑問に思っています。「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"
したがって、私が言及した「if」はこれを修正します:
form_for [@blog, @post], url: params[:action]=='new' ? blog_posts_path(@blog, @post) : blog_post_path(@blog, @post) do |f|
しかし、これは信じられないほど不器用に見えます。もっと良い方法があるはずです。