首页 > 解决方案 > form_for 嵌套路由 url 生成错误

问题描述

我有两个模型茶和评论。我已经嵌套了一条为特定茶创建评论的路线,但是当我提交表单时,我得到了一个 UrlGeneration Eror 基于缺少必需的键。下面是控制器动作和路径以及错误的图片。我试图让用户从 /teas/1/reviews/new 创建一个新评论,它是一个嵌套形式,问题是它不会保存创建。

Review Model

class Review < ApplicationRecord
  belongs_to :user
  belongs_to :tea


  validates :title, presence: true
  validates :rating, numericality: {only_integer: true, greater_than_or_equal_to: 0, less_than: 11}

  validates :tea, uniqueness: {scope: :user, message: "has already been reviewed by you" }

  scope :order_by_rating, ->{left_joins(:reviews).group(:id).order('avg(rating) desc')}


end

class ReviewsController < ApplicationController
  before_action :set_review, only:[:create, :show, :edit, :update, :destroy]

    def new
        if @tea = Tea.find_by_id(params[:tea_id])
          @review = @tea.reviews.build
        else
          @review = Review.new
        end
      end

      def create
        @review = current_user.reviews.build(review_params)
        if @review.valid?
          @review.save
          redirect_to new_review_path(@review)
        else
          render :new
        end
      end

      def show
        @review = Review.find_by_id(params[:id])
      end

      def index

        if @tea = Tea.find_by_id(params[:tea_id])
          @reviews = @tea.reviews
        else
          @reviews = Review.all
        end
      end

      def edit

      end

      def update

          @review.update(review_params)
          redirect_to tea_reviews_path(current_user.id)
      end

      def destroy
        @review.destroy
        flash[:delete_review] = "Review Deleted!"
        redirect_to reviews_path(@review)
    end



      private

      def review_params
         params.require(:review).permit(:tea_id, :content, :rating,:title)
      end

      def set_review
          @review = Review.find_by_id(params[:id])
          redirect_to reviews_path if !@review
      end
end

Route

  resources :reviews 
  resources :teas do
    resources :reviews, only: [:new, :index]
  end

错误

标签: ruby-on-railsrubymodel-view-controllercontroller

解决方案


在第 62 行Reviews_controller

redirect_to review_path if !@review

在此行中,如果评论不存在,您将尝试重定向到评论显示页面,

因此,当审查不存在时,它会重定向到不带 的显示路径id,这就是您收到错误的原因。

如果评论不存在,请仔细考虑您要重定向到哪里。


根据您更新的问题,

:createbefore_action控制器的第一行中删除,

另外,在您的create操作中将重定向更改为

redirect_to reviews_path

之后@review.save


推荐阅读