没有路由匹配{:controller =>“comments”,:action =>“create”} - 确实如此

时间:2013-01-29 22:51:41

标签: ruby-on-rails

编辑:我已经看过其中的一些但是找不到答案,所以我试图尽可能地记录它并提出这个问题。

我有一个带有嵌套注释资源的无模型rails应用程序(调用API)。如果我直接发表评论#new或comments #index action,我可以对一个故事发表评论,并相应地发表评论#create action。

但是,我非常希望能够在与父资源的#show操作相同的页面上发表评论:( opusses#show)

我尝试使用rake路由中的rails url_helper路径作为opuss_comments_path并明确说明控制器和操作。在这两种情况下,我仍然会收到此消息:

No route matches {:controller=>"comments", :action=>"create"}

这是我的路线db:

resources :users
resources :sessions,  only: [:new, :create, :destroy]
resources :osessions, only: [:new, :create, :destroy]

resources :authors do
  member do
    get   :following
    get   :followed
    post  :follow
  end
end

resources :opusses do

  resources :comments

  member  do
    get   :like
    get   :authorfeed
    post  :repost
  end
end

我的Rake Routes:

                   DELETE /authors/:id(.:format)                         authors#destroy
    opuss_comments GET    /opusses/:opuss_id/comments(.:format)          comments#index
                   POST   /opusses/:opuss_id/comments(.:format)          comments#create
 new_opuss_comment GET    /opusses/:opuss_id/comments/new(.:format)      comments#new
edit_opuss_comment GET    /opusses/:opuss_id/comments/:id/edit(.:format) comments#edit
     opuss_comment GET    /opusses/:opuss_id/comments/:id(.:format)      comments#show
                   PUT    /opusses/:opuss_id/comments/:id(.:format)      comments#update
                   DELETE /opusses/:opuss_id/comments/:id(.:format)      comments#destroy

&安培;&安培;

        like_opuss GET    /opusses/:id/like(.:format)                    opusses#like
  authorfeed_opuss GET    /opusses/:id/authorfeed(.:format)              opusses#authorfeed
      repost_opuss POST   /opusses/:id/repost(.:format)                  opusses#repost
           opusses GET    /opusses(.:format)                             opusses#index
                   POST   /opusses(.:format)                             opusses#create
         new_opuss GET    /opusses/new(.:format)                         opusses#new
        edit_opuss GET    /opusses/:id/edit(.:format)                    opusses#edit
             opuss GET    /opusses/:id(.:format)                         opusses#show
                   PUT    /opusses/:id(.:format)                         opusses#update
                   DELETE /opusses/:id(.:format)                         opusses#destroy

当我从评论#index页面调用下面的代码时,它完美无缺。然而,从另一个控制器发布到另一个表单是很常见的,当我从opusses#show页面调用此代码时,它会因上述错误而失败。

关于与URL帮助器有关的机会,我尝试明确地指定控制器和操作,但仍然无效 - 生成了相同的错误。

2 个答案:

答案 0 :(得分:2)

经典新手的错误,但对于其他人的好处=>

我有rake路线,我的路径是正确的,我没做的是提交父资源的id。因此POST到路径并包含有问题的对象。在我的情况下,这意味着opuss_comments_path(@opuss [“xyz”]),其中xyz是我的对象的id。

opuss_comments GET    /opusses/:opuss_id/comments(.:format)          comments#index
               POST   /opusses/:opuss_id/comments(.:format)          comments#create
啊,学习啊。 :)

答案 1 :(得分:1)

根据您的路线,您不必使用网址助手。但你必须确保你在控制器中的Opuss对象上有一个句柄。所以做这样的事情;

@opuss = Opuss.find(params[:id]) #or your equivalent finder code
@comment = @opuss.comments.build

然后在你看来;

<%= form_for([@opuss, @comment]) do |f| %>
  .... rest of form
<% end %>