2012-03-20 63 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