1

次のモデルがあるとします。

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|

しかし、これは信じられないほど不器用に見えます。もっと良い方法があるはずです。

4

1 に答える 1

0

リソースの URL をフォームに渡すことで簡単に解決できます。

<%= form_for [@blog, @post], :url => blog_posts_path(@blog, @post) do |f| %>
  ...
<%- end %>
于 2012-03-08T12:23:18.313 に答える