关联Restaurant与Review模型后出现reviews_path未定义错误求助
Rails嵌套路由下
reviews_path未定义错误修复方案 问题核心
触发undefined method 'reviews_path'错误的根源有三处:
- 表单中实例变量拼写错误
- 表单错误信息引用了未实例化的变量
- 控制器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
相关产品推荐
相关产品推荐

