【问题标题】:form_for nested route url generation errorform_for 嵌套路由 url 生成错误
【发布时间】:2020-03-21 22:16:37
【问题描述】:

我有两个模型茶和评论。我已经嵌套了一条为特定茶创建评论的路线,但是当我提交表单时,我收到了 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-rails ruby model-view-controller controller


    【解决方案1】:

    Reviews_controller 的第 62 行

    redirect_to review_path if !@review
    

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

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

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


    根据您更新的问题,

    从控制器第一行的before_action中删除:create

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

    redirect_to reviews_path
    

    @review.save之后。

    【讨论】:

    • 所以我调整到所有评论所在的评论路径,但现在我在终端中没有收到任何错误,也没有看到从嵌套路由添加的新评论。
    • 请添加您的完整控制器并解释您要做什么?您是否尝试创建新评论然后重定向到该评论显示页面?
    • 我已经添加了完整的评论控制器我已经能够单独创建评论,但还想使用 /teas/1/reviews/new 在嵌套路由中创建一个,然后将我带到那里保存评论并将用户引导回该特定茶的所有评论或所有评论。
    • 所以我进行了调整,但它只是再次呈现页面,好像我没有填写表格我认为这是因为它正在执行 else 逻辑并传递 if 循环。我最初将 create 放在我之前的操作中以尝试解决该问题。为了清楚起见,我还将添加我的评论模型
    • 另外,将@review.save 替换为@review.save!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多