Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 一个具有嵌套资源的多晶型资源的干路由_Ruby On Rails_Ruby On Rails 3_Routes_Actionpack - Fatal编程技术网

Ruby on rails 一个具有嵌套资源的多晶型资源的干路由

Ruby on rails 一个具有嵌套资源的多晶型资源的干路由,ruby-on-rails,ruby-on-rails-3,routes,actionpack,Ruby On Rails,Ruby On Rails 3,Routes,Actionpack,鉴于以下模型: class Blog < ActiveRecord::Base has_many :posts end class SiteBlog < Blog end class ProjectBlog < Blog end class Post <ActiveRecord::Base belongs_to :blog end 例如,在表单partial中,如果@blog是一个blog,则以下内容可以正常工作: form_for [@blog, @po

鉴于以下模型:

class Blog < ActiveRecord::Base
  has_many :posts
end

class SiteBlog < Blog
end

class ProjectBlog < Blog
end

class Post <ActiveRecord::Base
  belongs_to :blog
end
例如,在表单partial中,如果@blog是一个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)的路由来使用父模型(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"
所以我提到的“如果”可以解决这个问题:

form_for [@blog, @post], url: params[:action]=='new' ? blog_posts_path(@blog, @post) : blog_post_path(@blog, @post) do |f|

但这看起来非常笨拙,一定有更好的方法。

通过将资源url传递到表单,可以轻松解决:

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

我已经试过了,但是这个硬编码的URL只适用于新记录。使用相同表单进行编辑会触发“无路由匹配[PUT]/blogs/123/posts”错误。if可以解决这个问题,但是应该有一个不那么难看的方法去实现。听起来你的routes.rb是错误的。嵌套的blog/posts资源应该为更新posts提供精确的PUT资源。你能给我们看一下“rake路由”的输出吗?好吧,你不应该用PUT来路由到/blogs/123/posts。应该是/blogs/123/posts/。。。刚刚看到我的错误。试试我上面更新的链接。。。我在blog_posts url帮助程序中缺少@post对象。我没有使用PUT路由/blogs/123/posts。假设blog\u posts\u path helper不适合编辑(请参见上面的更新2)。您是对这些模型使用单表继承,还是有site\u blogs和project\u blogs表?另外,为什么需要在模型级别区分它们?
<%= form_for [@blog, @post], :url => blog_posts_path(@blog, @post) do |f| %>
  ...
<%- end %>