2012-07-09 83 views
0

我想爲一個模型生成一個名稱空間從一個控制器的網址。例如:Rails的url_for命名空間模型和非命名空間的控制器

module SomeStuff 
    class Widget < ActiveRecord::Base; end 
end 

class WidgetsController < ApplicationController 
    def create 
    w = Widget.create(params) 
    location = url_for w 
    render :json => w, :location => location 
    end 
end 

的問題是Rails的想要一個「some_stuff_widget_path」存在,它不會因爲控制器沒有命名空間。我嘗試了另一篇文章中給出的解決方案(http://stackoverflow.com/questions/4404440/rails-url-for-and-namespaced-models),但他們似乎沒有工作。

我的模型在技術上屬於命名空間的單獨gem,然後我的Rails應用程序包含該gem並提供控制器。在不改變設置的情況下,有沒有辦法讓「url_for」工作?在您的意見之一提到

+0

爲什麼不運行'rake routes'來查找您想要鏈接到上述'url_for'中的路由的方法名並將'w'傳遞給它? – deefour 2012-07-09 14:38:58

+0

rake routes並不告訴我方法,但是,Rails給我的錯誤是它試圖在控制器上調用「some_stuff_widget_path」,但控制器沒有該方法b/c控制器沒有命名空間。 – codecraig 2012-07-09 15:12:25

+0

'耙路線'會告訴你在你的應用程序中的所有路線。通過傳遞'w',你要求鐵軌猜測你要使用的路線的方法。由於您所處的命名空間情況,它錯誤地猜測出'some_stuff_widget_path',所以我建議您查看'rake routes'生成的路徑列表以查找正確的方法路徑。如果不存在這樣的方法,那麼您還沒有定義任何路由來匹配您之後的路徑,並且必須在'config/routes.rb'中執行。 – deefour 2012-07-09 15:35:57

回答

1

如上,你有

resources :widgets 

config/routes.rb。在location你想與url_for上述設置,你要符合以下航線

widget GET /widgets/:id(.:format) widgets#show 

但正如你所說,url_for w是反而造成軌道猜測你所尋找的(不存在)some_stuff_widget_path路線。相反,將該行更改爲

location = url_for widget_path(w) 
+0

非常感謝,工作! – codecraig 2012-07-09 16:40:30

+0

具體如下: location = url_for widget_url(w) – codecraig 2012-07-09 17:24:46

+0

如果您要在傳遞類實例以生成url的地方使用'form_for'助手,此方法將不起作用。 [鏈接的問題](http://stackoverflow.com/questions/4404440/rails-url-for-and-namespaced-models?lq=1) 有更好的方法。 – olhor 2014-12-13 12:53:08