如何使用新操作的参数声明rails资源?

时间:2012-03-20 20:43:44

标签: ruby-on-rails routes

我有一个名为 Entree 的模型,new操作需要一个参数,另一个名为 Cave 的模型的id。因为Cave已经嵌套,所以我不想将Entree嵌入Cave中 我所做的是在routes.rb

中将资源Entree声明为以下内容
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资源?

5 个答案:

答案 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视图。这是由控制器本身决定的。渲染示例:

  • render:new将呈现新动作的视图
  • 渲染'主菜/新'将呈现主菜/新模板

答案 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