3

我有一些引擎安装在另一个引擎中,因为这个引擎将由来自不同引擎的多个子元素组成。该引擎最终安装在主应用程序中。我的路线如下:

Rails.application.routes.draw do

  namespace :Parent_Engine, :path  => "/foo" do
    match "/", :to=>"parent_engine#index"

    resources :parent_engine , :only=>[:show] do
      mount Engine1::Engine => '/engine1'
      mount Engine2::Engine => '/engine2'
    end
  end
end

现在,当我希望看到来自“engine1”的元素时,我只需将 url 作为

/parent_engine/:id/engine1/object_type/:id

我面临的问题是我需要通过显式更新浏览器中的 url 来阻止用户访问 engine1 的另一个对象。例如:

从:

/parent_engine/1/engine1/object_type/1

至:

/parent_engine/2/engine1/object_type/2

我也不能检查已安装的引擎,因为这些引擎也单独安装在容器应用程序中。我只是不希望用户能够在父引擎的上下文中重定向到另一个对象实例。

感谢并提前向您提供任何帮助。

4

1 回答 1

0

我不确定你到底想做什么,但我怀疑你可能能够使用路由约束:

Rails.application.routes.draw do

  namespace :Parent_Engine, :path  => "/foo" do
    match "/", :to=>"parent_engine#index"

    resources :parent_engine , :only=>[:show] do
      mount Engine1::Engine => '/engine1', :constraints => Engine1Contraint.new
      mount Engine2::Engine => '/engine2'
    end
  end
end

config/initializers/engine1_contraints.rb然后你可以定义

class Engine1Contraint
  def matches?(request)
    request.path != 'something' || request.env['warden'].user == 'Admin'
  end
end

或者您需要在那里调整的任何规则,从母引擎到控制子引擎。

于 2013-05-02T22:56:01.673 回答