Rails嵌套资源路由错误排查求助
搞定Rails嵌套资源的路由错误
嘿,我太懂这种嵌套资源踩路由坑的感觉了!给你一步步理清楚怎么解决这个问题:
1. 先确认你的路由配置没毛病
首先得保证config/routes.rb里的嵌套路由写法是对的,应该像这样:
resources :users do resources :pages end
写完之后,在终端跑一下rails routes命令,就能看到生成的所有路由,你要确认new_user_page_path和user_pages_path这俩辅助方法确实存在,对应的动作是pages#new和pages#create。
2. 修正你的系统测试代码
你说测试里用了错误的pages_path,那咱们把它换成正确的嵌套路径就行。注意测试里得先有一个有效的用户实例,不然路由会因为缺用户ID报错。比如改成这样:
test "访问用户的新建页面" do # 先创建一个测试用的用户 @user = User.create!(name: "测试用户", email: "test@example.com") # 用正确的嵌套路由辅助方法访问页面 visit new_user_page_path(@user) # 这里可以加你的断言,比如检查页面标题 assert_selector "h1", text: "新建页面" end
3. 把视图里的表单提交路径改对
在app/views/pages/new.html.erb里,表单的提交目标得是嵌套的user_pages_path(@user),最简单的写法是用数组形式的model参数,Rails会自动帮你生成正确的路径:
<%= form_with(model: [@user, @page], local: true) do |form| %> <!-- 这里放你的表单字段,比如标题、内容输入框 --> <%= form.label :title %> <%= form.text_field :title %> <%= form.submit "创建页面" %> <% end %>
这样表单提交的时候就会往user_pages_path(@user)发POST请求,对应pages#create动作。
最后再检查控制器的动作
确保pages_controller.rb里的new和create动作正确关联了用户:
class PagesController < ApplicationController def new @user = User.find(params[:user_id]) @page = @user.pages.new end def create @user = User.find(params[:user_id]) @page = @user.pages.build(page_params) if @page.save redirect_to user_page_path(@user, @page), notice: "页面创建成功!" else render :new end end private def page_params params.require(:page).permit(:title, :content) end end
要是还不行,再跑一遍rails routes仔细核对路由表,看看是不是哪里的命名或者参数错了,大概率就能解决啦!
内容的提问来源于stack exchange,提问作者Randall Blake
相关产品推荐
相关产品推荐

