Rails引擎:命名空间多态URL

时间:2012-08-29 06:23:09

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我有一个Rails引擎MyEngine,它没有一个独立的命名空间。根据{{​​3}},我正在尝试使用多态帮助程序生成资源链接。

引擎路线:

# config/routes.rb
...
  namespace :admin do
    resources :my_resource
  end
...

rake app:routes的示例输出(记住,这是一个引擎):

    admin_my_resources GET    /admin/my_resources(.:format)          my_engine/admin/my_resources#index
                       POST   /admin/my_resources(.:format)          my_engine/admin/my_resources#create
 new_admin_my_resource GET    /admin/my_resources/new(.:format)      my_engine/admin/my_resources#new
edit_admin_my_resource GET    /admin/my_resources/:id/edit(.:format) my_engine/admin/my_resources#edit
     admin_my_resource PUT    /admin/my_resources/:id(.:format)      my_engine/admin/my_resources#update
                       DELETE /admin/my_resources/:id(.:format)      my_engine/admin/my_resources#destroy

如果my_resource是标识为MyResource的{​​{1}}模型的实例,我希望:

12345

渲染:

polymorphic_url([my_engine, :admin, my_resource])

但我错了。相反,我得到一个例外:

/my_engine/admin/my_resource/12345

因此,undefined method `admin_my_engine_my_resource_path'... 正在尝试使用polymorphic_url,它应该使用更像admin_my_engine_my_resource_path

的内容

Rails似乎正在以错误的方式添加my_engine.admin_my_resource_path(my_resource) ......或者我做错了吗?

3 个答案:

答案 0 :(得分:3)

您是否尝试通过范围而不是命名空间来执行此操作?

请参阅此SO文章以获得更好的解释。 Rails Scoped Routing

一个很好的例子是设计宝石。

祝你好运!

答案 1 :(得分:0)

运行rake routes并从那里获取url帮助函数名称。您也可以在此处分享rake routes输出。

答案 2 :(得分:0)

我最近在Rails 5中遇到了这个问题,并找到了以下一般解决方案。

给出我的名为YamsCore的引擎,该引擎以以下形式生成常用的url帮助程序:

url_for(yams_core.album_tracks_path)

您可以编写一个接受任何模型的通用视图助手,并通过以下方式生成网址:

path = polymorphic_path([view.yams_core, my_resource])

,以及是否需要指定操作

path = polymorphic_path([view.yams_core, my_resource], action: :edit)

path = polymorphic_path([view.engine_prefix, my_resource])