像狂欢一样在引擎中使用Rails URL和路径助手

Jar*_*rod 2 ruby-on-rails rails-routing spree ruby-on-rails-4

我正在尝试在我的Rails 4引擎视图中使用一些URL和/或路径助手,例如resource_url或resource_path.这些引擎的配置与典型的可安装教程略有不同.实际上,如果没有Spree :: ENGINE_NAME命名空间,它们更像Spree的工作方式.

像Spree的架构一样,我正在尝试创建其他引擎所依赖的核心引擎.例如,我的后端引擎的routes.rb文件如下所示:

Core::Engine.add_routes do

    # Check to see if the request comes in on a subdomain
    # The Subdomains class passed into constraints()
    # is a class defined in lib/subdomain.rb
    constraints(Subdomain) do
      match '/manage' => "manage#index", :via => [:get]
    end

end
Run Code Online (Sandbox Code Playgroud)

在我的后端引擎内部的视图中,我希望能够使用一些URL /路径助手来执行以下操作:

<%= link_to manage_path, manage_path %>
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我在核心引擎上绘制路线.所以,我必须使用

<%= link_to core_engine.manage_path, core_engine.manage_path %>
Run Code Online (Sandbox Code Playgroud)

狂欢不知何故绕过这个,但我不确定如何.例如,在backend/app/views/spree/admin/products/index.html.erb:

<%= link_to product.try(:name), edit_admin_product_path(product) %>
Run Code Online (Sandbox Code Playgroud)

请注意,edit_admin_product_path但实际上没有提到核心引擎.

有任何想法吗?

Rya*_*igg 6

我们通过绘制核心引擎上的所有路径来解决这个问题,add_routes因为它是一个很长的切线,因此我不会进入这里.但是,这种工作是必要的邪恶.

范围isolate_namespace内的方法Core::Enginespree命名空间的所有内容.如果您位于Spree::Core::Engine路线下方绘制的控制器内,并且您想引用另一个也在该路线下绘制的控制器的路线,那么您可以spree.在路由助手上留下前缀.

如果您要路由到其他引擎,那么您将需要具有前缀:main_app.或者其他.

引擎指南解释了这个更详细,我建议你阅读这一点.