ruby-on-rails - 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
解决方案
在第 62 行Reviews_controller
redirect_to review_path if !@review
在此行中,如果评论不存在,您将尝试重定向到评论显示页面,
因此,当审查不存在时,它会重定向到不带 的显示路径id
,这就是您收到错误的原因。
如果评论不存在,请仔细考虑您要重定向到哪里。
根据您更新的问题,
:create
从before_action
控制器的第一行中删除,
另外,在您的create
操作中将重定向更改为
redirect_to reviews_path
之后@review.save
。
推荐阅读
- angular - 子组件中的 Angular @Input 也会更新父组件中的值
- python - 无法将 Gunicorn/Flask HelloWorld 扩展到超过 125 RPS
- javascript - 检查不和谐链接并删除
- javascript - How to find the width of a text-field in symbol type in mapbox
- gradle - 如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?
- c - 在 4 位数据模式下,是否可以将其他 4 位用于其他内容?
- reactjs - ReactJS:单击时重新加载/重新渲染组件
- laravel - 将先前查询的值访问到新的嵌套查询 laravel
- vba - How to display table values for a single event, multiple rows for a single attribute, in text boxes, as if I were using a crosstab query
- r - Doing a left join with exact values plus closest values