Rails RSpec测试视图编辑表单时simple_form路由匹配缺失id报错问题
问题根因
- 你的Rails项目为支持多语言,路由配置了带
locale占位符的前缀,且未给locale设置全局默认值 - 视图测试环境默认不会自动为路由辅助方法注入
locale参数,simple_form_for自动推断表单提交路径时,会按顺序填充路由占位符,第一个缺省的locale参数会被传入的@post_category实例填充,导致后续资源需要的id参数没有对应值,因此抛出缺失[:id]的报错 - 如果你的
post_categories路由配置在admin等命名空间下,未指定命名空间的情况下simple_form_for也会错误推断路由路径,进一步加剧参数匹配错误
修复方案
方案1:配置视图测试默认locale参数(推荐)
在spec/rails_helper.rb中添加视图测试的全局默认URL参数配置,自动注入locale值,避免路由参数匹配错位:
RSpec.configure do |config| # 其他原有配置 config.before(:each, type: :view) do helper.default_url_options[:locale] = I18n.default_locale end end
方案2:显式指定表单路径/命名空间
如果你的post_categories路由在admin命名空间下,修改视图的simple_form_for调用,指定命名空间即可让路由自动推断正常工作:
= simple_form_for [:admin, @post_category] do |f|
也可以直接显式指定表单提交路径,完全避免自动推断错误:
= simple_form_for @post_category, url: admin_post_category_path(locale: I18n.locale, id: @post_category.id) do |f|
方案3:路由配置添加locale默认值
修改config/routes.rb中多语言路由的配置,给locale设置默认值,所有环境下都不会出现路由参数匹配错位的问题:
scope '(:locale)', locale: /#{I18n.available_locales.join('|')}/, defaults: { locale: I18n.default_locale } do # 你的所有路由配置,包括post_categories相关路由 end
补充排查
如果修改后仍存在问题,可在测试的render调用前显式将变量注入视图上下文:
it "renders the edit post_category form" do assign(:post_category, @post_category) render # 其余原有断言 end
内容的提问来源于stack exchange,提问作者Vasil Laurynovich
相关产品推荐
相关产品推荐

