2012-03-20 58 views
11

我有一个模型,名为进入其中new行动需要一个参数,另一个模型的名称的编号。由于Cave已经嵌套,我不想将Entree嵌套在Cave中。
我所做的就是声明的资源主菜按照routes.rb如何使用新操作的参数声明rails资源?

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操作参数的路由文件中?

+0

你到底想干什么?通常/ new生成一个表单,您可以在其中输入参数,然后通过create操作进行创建。 – varatis 2012-03-20 21:02:47

回答

19

我不知道这是一个黑客或不是,但下面的作品看起来比2层嵌套更清洁。现在

resources :entrees, :except => [:new] do 
    collection do 
    get 'new/:id', :to => "entrees#new", :as => 'new' 
    end 
end 

我可以做一个render "new"而不是redirect_to。 我必须说我必须错误地问我的问题,我的不好。

+0

与Vittorius建议的解决方案相比,它有一个小缺点:您将最终得到一个像new_things_path(复数)这样的URL助手而不是new_thing_path(单数,听起来正确)。 – 2015-05-04 19:26:26

+0

查看[我的回答如下](http://stackoverflow.com/a/34113174/1106878),因为它概述了用简单的Rails做这件事的一种不太古怪的方式。 – sbonami 2016-01-25 17:58:29

0

如果你想使用铁路s resource routes,你将不得不根据他们的工作

resources :caves do 
    resources :entrees 
end 

拿到路线/caves/70/entrees/new

否则嵌套他们,你是在创造手动匹配的世界路线。我不明白为什么你不得不使用重定向? new_entrees路由有效。您将无法使用form_for helper,因为它不是资源,但form_tag helper可以使用。

UPDATE:渲染和路线

路由不直接改变什么观点是在控制器rendered。这是由控制器本身决定的。渲染例子:

  • 渲染:新会呈现新的行动的看法
  • 渲染“主菜/新”将使得主菜/新模板
+0

洞穴已经是一个嵌套的资源,我不想要2层的嵌套。另外,new_entree路由路径确实是有效的,但由于它不是一个操作,我不能使用渲染。或者我可以吗?我现在不在我的开发机器上,但我会尽快尝试。 – Antoine 2012-03-20 21:06:09

+0

您可以单独添加资源:洞穴分开除了嵌套版本 – mguymon 2012-03-20 21:07:09

+2

+1巢穴它。两个级别,如果你需要。当您使用导轨时,您需要使用导轨方式,否则它会成为黑客入侵。 – 2012-03-20 21:10:29

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 
4

为了提高gwik的解决方案(这实际上并没有为我工作):

resources :things, except: [:new] do 
    new do 
    get ':param', to: 'things#new', as: '' 
    end 
end 

它可以让你免费new_thing_(的new_things_ *代替)*帮手。

10

Rails有route helper称为path_names做这个:

resources :entrees, path_names: { new: 'new/:id' } 
+1

这是一个很棒的答案。 – skwidbreth 2016-01-24 22:42:54

+1

这太神奇了!谢谢! – MrR 2016-09-06 12:25:45