You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联Restaurant与Review模型后出现reviews_path未定义错误求助

Rails嵌套路由下reviews_path未定义错误修复方案

问题核心

触发undefined method 'reviews_path'错误的根源有三处:

  1. 表单中实例变量拼写错误
  2. 表单错误信息引用了未实例化的变量
  3. 控制器destroy动作使用了错误的路由辅助方法

具体修复步骤

1. 修正表单实例变量拼写

在reviews/_form.html.erb中,将拼写错误的@resturant改为@restaurant:

<%= form_with(model: [@restaurant, @review], local: true) do |form| %>

2. 修正错误信息变量引用

表单中review.errors未定义,替换为实例变量@review.errors:

<% if @review.errors.any? %>
  <div style="color: red">
    <h2><%= pluralize(@review.errors.count, "error") %> prohibited this review from being saved:</h2>
    <ul>
      <% @review.errors.each do |error| %>
        <li><%= error.full_message %></li>
      <% end %>
    </ul>
  </div>
<% end %>

3. 修正destroy动作跳转路由

嵌套路由下不存在独立的reviews_url,在ReviewsController的destroy方法中,改为跳转到对应餐厅页面:

def destroy
  @review.destroy

  respond_to do |format|
    format.html { redirect_to restaurant_path(@restaurant), notice: "Review was successfully destroyed." }
    format.json { head :no_content }
  end
end

4. 验证路由辅助方法

运行rails routes确认嵌套路由结构,正确的评论创建路由为restaurant_reviews_path,修正表单变量拼写后,form_with会自动匹配该路由。

额外优化建议

给set_restaurant前置动作添加错误处理,避免餐厅不存在时抛出异常:

def set_restaurant
  @restaurant = Restaurant.find_by(id: params[:restaurant_id])
  redirect_to root_path, alert: "Restaurant not found" unless @restaurant
end

内容的提问来源于stack exchange,提问作者jimW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:16:24