我有一个名为 Entree 的模型,new
操作需要一个参数,另一个名为 Cave 的模型的id。因为Cave已经嵌套,所以我不想将Entree嵌入Cave中
我所做的是在routes.rb
:
resources :entrees, :except => [:new]
match "/entrees/new/:id", :to => "Entrees#new", :as => 'new_entree'
这样可行,但问题是当create
操作中出现错误时,我想再次使用无效输入显示页面。但由于没有new
操作,我必须执行redirect_to new_entree_path
,这不会保留用户输入。
我尝试了以下(最简单的)路线:
resources :entrees
但是路径http://localhost:3000/entrees/new/32
会返回错误:
No route matches [GET] "/entrees/new/32"
问题是,如何使用new
操作的参数在routes文件中声明Entree资源?
答案 0 :(得分:19)
我不确定这是否是黑客攻击,但以下工作并且看起来比2级嵌套更清晰。
resources :entrees, :except => [:new] do
collection do
get 'new/:id', :to => "entrees#new", :as => 'new'
end
end
现在我可以render "new"
代替redirect_to
。
我必须说我一定是错误地问了我的问题,不好。
答案 1 :(得分:12)
Rails有一个名为path_names
的{{3}}可以执行此操作:
resources :entrees, path_names: { new: 'new/:id' }
答案 2 :(得分:5)
改善gwik的解决方案(实际上对我不起作用):
resources :things, except: [:new] do
new do
get ':param', to: 'things#new', as: ''
end
end
它可以免费获得new_thing_ *助手(而不是new_things_ *)。
答案 3 :(得分:0)
如果你想使用Rail s resource routes,你必须根据它们的工作方式嵌套它们
resources :caves do
resources :entrees
end
获取路线/caves/70/entrees/new
否则,您处于创建手动匹配路线的世界。
match "/entrees/new/:id", :to => "entrees#new", :as => 'new_entrees'
我不明白为什么你被迫使用重定向? new_entrees路由有效。您将无法使用form_for helper,因为它不是资源,但form_tag helper可以使用。
更新:渲染和路线
路由不直接更改Controller中的rendered视图。这是由控制器本身决定的。渲染示例:
答案 4 :(得分:0)
我发现这会生成正确的 new_thing_path 方法,而不是new_things_path作为Antoine的解决方案。
resources :things, :except => [:new] do
with_scope_level(:new) do
get 'new/:param', :to => "things#new", :as => ''
end
end