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 MyResource
的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
,它应该使用更像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的主要内容,如果未能解决你的问题,请参考以下文章