我正在使用ruby on rails博客教程,每次我尝试编辑评论时都会收到错误消息。 错误:没有路由匹配缺少必需的密钥:[:id]。
请帮助我对此不熟悉。
在第3行附近发现错误。
<h1>Editing comment</h1>
3. <%= form_for([:post, @comment]) do |f| %>
4. <div class="field">
5. <%= f.label :name %>
<%= f.text_field :name %>
这是我的routes.rb文件代码
Rails.application.routes.draw do
resources :posts do
resources :comments
end
end
我的评论_controller.rb代码
class CommentsController < ApplicationController
# GET /comments
# GET /comments.json
def index
@comments = Comment.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @comments }
end
end
# GET /comments/1
# GET /comments/1.json
def show
@comment = Comment.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @comment }
end
end
# GET /comments/new
# GET /comments/new.json
def new
@comment = Comment.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @comment }
end
end
# GET /comments/1/edit
def edit
@comment = Comment.find(params[:id])
end
# POST /comments
# POST /comments.json
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(comment_params)
respond_to do |format|
if @comment.save
format.html { redirect_to @post, notice: 'Comment was successfully created.' }
format.json { render json: @post, status: :created, location: @comment }
else
format.html { render action: "new" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# PUT /comments/1
# PUT /comments/1.json
def update
@comment = Comment.find(params[:id])
@post = @comment.post
respond_to do |format|
if @comment.update_attributes(params[:comment])
format.html { redirect_to @post, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# DELETE /comments/1
# DELETE /comments/1.json
def destroy
@comment = Comment.find(params[:id])
@post = Post.find(params[:post_id])
@comment.destroy
respond_to do |format|
format.html { redirect_to @post, notice: 'Comment was successfully deleted!' }
format.json { head :no_content }
end
end
def comment_params
params.require(:comment).permit(:post_id, :name, :email, :body)
end
end
答案 0 :(得分:1)
所以,单独留下评论,让我试着解释一下我认为这是你的问题。
在您的路线文件中,您拥有嵌套资源,这意味着:
resources :posts do
resources :comments
end
end
是所谓的嵌套资源,这意味着您有以下路由:
posts/:post_id
posts/:post_id/comments/:comment_id
如果您运行rake routes
,则可以看到。
这也意味着第一条路线将在PostsController
上调用操作,第二条路线将在您的CommentsController
上调用操作。
所以我建议你在你的控制器中做的是首先将表单呈现为[@post, @comment]
,这将告诉form_for
助手使用你的嵌套资源作为'发送路径的'形成'。
要让此表单调用您的编辑方法,您需要说明您希望在那里提交表单。这是通过form_for帮助器(http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html)的选项完成的,这是必要的,因为rails喜欢/是! RESTfull,在此之下,相同的路由可能有多种行为,具体取决于您使用的HTTP动词/方法。
所以,请注意我上面提到过的,你可能会猜到你做错了什么。
作为最后一个提示,你的控制器有这个:
# GET /comments/1/edit
def edit
@comment = Comment.find(params[:id])
end
这个方法呈现了这个(我假设):
<h1>Editing comment</h1>
<%# I already fixed the form_for here %>
<%= form_for([@post, @comment]) do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
<% end %>
此表单由编辑操作呈现,将(可能)提交给更新操作。此更新操作位于/posts/:post_id/comments/:comment_id
下,可以使用PATCH(rails 4.0)动词调用。因此,您的form_for
需要首先将一个帖子分配给变量@post
,该变量应由其控制器传递。其次,它需要走正确的路线。
在这里你很幸运,因为Rails非常聪明,可以看到你提交的内容是new_record?
,然后它的form_for
将指向创建,如果不是,则指向更新。
所以你现在需要做的就是将Post
分配给@post
,你可能会很高兴。
如果这对您有用,请告诉我。