注释中的ActionController :: UrlGenerationError#edit - Rails 4.0

时间:2014-06-30 01:12:12

标签: ruby-on-rails ruby

我正在使用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

1 个答案:

答案 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,你可能会很高兴。 如果这对您有用,请告诉我。