form_for ошибка создания URL-адреса вложенного маршрута - PullRequest
1 голос
/ 22 марта 2020

У меня две модели чая и обзор. Я вложил маршрут для создания отзывов для определенного c чая, но когда я отправляю форму, я получаю сообщение об ошибке UrlGeneration на основании отсутствия необходимого ключа. Ниже приведено действие контроллера и маршрут и изображение ошибки. Я пытаюсь, чтобы пользователь создал новый отзыв из / 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

error

1 Ответ

1 голос
/ 22 марта 2020

В строке 62 из Reviews_controller

redirect_to review_path if !@review

В этой строке вы пытаетесь перенаправить на страницу просмотра обзора, если обзор не существует,

, следовательно, когда обзор не ' Если он существует, он перенаправляет на отображение пути без id, поэтому вы получаете сообщение об ошибке.

Тщательно продумайте, куда вы хотите перенаправить, если обзор не существует.


В соответствии с вашим обновленным вопросом

Удалите :create из before_action в первой строке контроллера,

также, в вашем действии create измените перенаправление на

redirect_to reviews_path

после @review.save.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...