Rails引擎:命名空间多态URL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails引擎:命名空间多态URL相关的知识,希望对你有一定的参考价值。

我有一个没有孤立命名空间的Rails引擎MyEngine。我正在尝试使用多态助手来生成资源链接,根据docs

引擎路线:

# 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是具有ID MyResource12345模型的实例,我希望:

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,它应该使用更像my_engine.admin_my_resource_path(my_resource)的东西

Rails似乎是以错误的方式添加:admin ......或者我做错了吗?

答案

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

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

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

祝好运!

另一答案

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

另一答案

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

鉴于我的引擎名为YamsCore,它在表单中生成通常的url助手:

url_for(yams_core.album_tracks_path)

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

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])

以上是关于Rails引擎:命名空间多态URL的主要内容,如果未能解决你的问题,请参考以下文章

Rails多态命名边缘情况

Rails 隔离引擎模型关联

管理命名空间中的 redirect_to 对象

Rails 方式 - 命名空间

2017-04-14命名空间访问修饰符封装继承多态

Rails 中的命名空间模型:联合的状态是啥?