2012-07-09 117 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