2016-11-12 59 views
1

比方說,我有一個表格是在:渲染方法URL這麼想的匹配原始地址

/分類/新

當表單輸入無效我打電話渲染。經典範例:

def create 
    @category = Category.new(category_params) 
    if @category.save 
     flash[:success] = 'Category successfully created.' 
     redirect_to @category 
    else 
     render 'new' 
    end 
    end 

我的問題是,爲什麼網站路徑後調用render就是:

/類別

,而不是:

/分類/新

據我所知,'新'表格應該在同一頁上呈現,這兩條路徑顯然不一樣。

正如評論者建議在這裏的附加信息:

相關路線:

resources :categories do 
    resources :topics, name_prefix: 'category_', 
         except: [:index, :show, :edit, :update, :destroy] 
    end 

類新動作:

def new 
    @category = Category.new 
    end 
+0

您能顯示相關路線嗎? – Gaston

+0

請分享加斯頓建議的路線。也請分享方法新! – Acacia

+0

我懷疑它與我的應用程序有關。我從邁克爾哈特爾教程中檢查了另一個,它的行爲是一樣的。 – Kammil

回答

0

不要混淆什麼網址顯示了什麼是真正呈現。

簡答

當您最初輸入表單,你實際上是做一個POST/categories。這當然會映射到您的控制器中的create動作,當失敗驗證導致新表單呈現時 - 它不是重定向,因此url不會更改 - url保持與輸入動作時的相同。

詳解

當你調用/categories/new你實際上是在路由到類別控制器上的new行動。

您的new操作會設置任何實例變量,例如@category,並且Rails會渲染包含您的新類別表單的new.html.erb。

當你提交表單時,它實際上是在做一個http POST/categories,這條路由到你的類別控制器的create動作。該URL和HTTP方法是從的form_for助手產生什麼結果:

<%= form_for @category do |f| %> 

這就是爲什麼從/categories/new網址更改爲/categories

現在create行動,如果失敗的驗證只是呈現了新形式 - 它不會在任何地方重定向 - 網址與進入此操作時的網址保持不變 - 意味着它保持爲/categories

不要混淆網址的變化與重定向它只是表單發佈到一個不同的網址比/ categories/new,而url的變化實際上只是一個整容問題。現在

如果是你一個問題,你可以將路由更改爲類似如下:

resources :categories, except: [:create, :new] 

    post  'new_category' => 'categories#create' 
    get  'new_category' => 'categories#new' 

這是映射POST和GET HTTP方法/ new_category這樣的URL出現相同新的和創建的動作調用。請注意,您需要更改form_for helper中的網址以使用此新路線:

<%= form_for @category, url: 'new_category' do |f| %> 
+0

這就解釋了一切。謝謝。 – Kammil

+0

您的歡迎...很高興我能幫助...反思我正在考慮將我對另一個問題的更充分的解釋編輯到這一個。你的問題更簡潔 – David

+1

這可能是一個好主意,因爲我在查詢之前搜索了一個答案的stackoverflow,並且沒有發現你在這裏鏈接的問題。 – Kammil