1

我创建了嵌套桩模型里面,但是当我尝试更新的评论我得到这个错误的评论支架:无法在Ruby on Rails中更新审阅脚手架?错误:NoMethodError在ReviewsController#更新

NoMethodError in ReviewsController#update 
undefined method `review_url' for #<ReviewsController:0x007fe1420ea4e0>** 

这里是我的代码

reviews_controller.rb

class ReviewsController < ApplicationController 
    before_action :set_review, only: [ :edit, :update, :destroy, :upvote,:downvote] 
    before_action :set_post 
    before_action :authenticate_user! 

    respond_to :html 

    def new 
    @review = Review.new 
    respond_with(@review) 
    end 

    def edit 
    @review = Review.find(params[:id]) 
    @post = Post.find(params[:post_id]) 
    end 

    def create 
    @review = Review.new(review_params) 
    @review.user_id = current_user.id 
    @review.post_id = @post.id 
    @review.save 
    redirect_to post_path(@post) 
    end 

    def update 
    @review.update(review_params) 
    respond_with(@review) 
    end 

    def destroy 
    @review.destroy 
    respond_with(@review) 
    end 

    def upvote 
    @review.upvote_from current_user 
    redirect_to :back 
    end 

    def downvote 
    @review.downvote_from current_user 
    redirect_to :back 
    end 

    private 
    def set_review 
     @review = Review.find(params[:id]) 
    end 

    def set_post 
     unless @post = Post.where(id: params[:post_id]).first 
     redirect_to posts_path, flash: {alert: "Post doesn't exists"} 
     end 
    end 

    def review_params 
     params.require(:review).permit(:comment) 
    end 
end 

post_controller.rb

class PostsController < ApplicationController 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! , only: [:edit,:update,:destroy,:new] 

    # GET /posts 
    # GET /posts.json 
    def index 
    @posts = Post.all 
    end 

    # GET /posts/1 
    # GET /posts/1.json 
    def show 
    @reviews = Review.where(post_id: @post.id) 
    end 

    # GET /posts/new 
    def new 
    @post = Post.new 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.json 
    def create 
    @post = Post.new(post_params) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @post } 
     else 
     format.html { render :new } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /posts/1 
    # PATCH/PUT /posts/1.json 
    def update 
    respond_to do |format| 
     if @post.update(post_params) 
     format.html { redirect_to root_path, notice: 'Post was successfully updated.' } 
     format.json { render :show, status: :ok, location: @post } 
     else 
     format.html { render :edit } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.json 
    def destroy 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_post 
     @post = Post.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def post_params 
     params.require(:post).permit(:title, :description) 
    end 
end 

评论/ _form.html.erb

<%= form_for([@post,@review]) do |f| %> 
    <% if @review.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@review.errors.count, "error") %> prohibited this review from being saved:</h2> 

     <ul> 
     <% @review.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="form-group"> 
    <%= f.label :comment %><br> 
    <%= f.text_area :comment , class: "form-control"%> 
    </div> 
    <div class="form-group"> 
    <%= f.submit class: "btn btn-primary" %> 
    </div> 
<% end %> 

有没有人收到这个问题?

这是我收到的画面捕获图像: NoMethodError in ReviewsController#update

的routes.rb中文件

Rake Routes

+1

尝试将表单更改为'form_for(@review)',您也不需要在编辑操作中设置'@ review'和'@ post'变量,因为它们都是用'before_action'设置的。最后,您可以运行'rake routes'并确保您有一条为'reviews#update'定义的路线。 – dinjas

+0

我试过这样做,但仍然得到相同的错误! – AHmed

+0

@AHmed,你能展示'rake routes'的结果吗? – nsave

回答

1

由于您使用嵌套的路线,你需要respond_with这两个资源。 (见Nested resources documentation)。

你得到的错误是由于没有路由正在为reviews#showreviews_url)定义的,所以你需要创建posts下嵌套在该路线和操作添加到您的ReviewsController

或者,您可以respond_with(@post)并让您的reviews#update操作将用户发送给Posts#show