编辑:我已经看过其中的一些但是找不到答案,所以我试图尽可能地记录它并提出这个问题。
我有一个带有嵌套注释资源的无模型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帮助器有关的机会,我尝试明确地指定控制器和操作,但仍然无效 - 生成了相同的错误。
答案 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 %>