首先我确定我没有正确地提出这个问题,因为这是我现在头脑中的高级Rails主题。以下是我对路线的看法:
concern :assetable do
resources :assets, concerns: [:workable, :trackable, :flagged, :historical, :commentable, :uploadable], shallow: true do
resources :assets, path: :components, as: :components, shallow: true#, only: [:index, :create, :new]
end
end
和我的资产模型:
has_many :assets, :as => :assetable, :dependent => :destroy
alias_attribute :components, :assets
我的前提是我有一个Asset
模型,它可以多态地属于我的Rails应用程序中的任何其他模型 - 包括另一个Asset
。我的情况是我将这个案例限制在一个深度并且调用这些Components
。这就像将汽车作为资产并且它具有发动机,变速器等作为组件。出于我的目的,它很简单,可以创建一组在资产和组件之间共享的公共属性,
现在我可以创建一个完整的新模型,但是整个数据结构,视图控制器等大部分都是相同的,所以我认为这只是浪费时间并且使得这些代码保持同步变得一团糟。
在我现在进行的过程中,我不得不在我的观点中添加一些逻辑来确保标题,即“资产”和“资产”。与"组件"我在我的控制器@asset_class
中有一个简单的实例变量,它返回' asset'或者'组件'。现在丑陋的部分是我开始使用路线。所有令人敬畏的Rails url助手等都让我失败了,因为如果我在组件记录上调用url_for( )
,那么当我真正想要/assets/etc/etc
时,我会得到/components/etc/etc/
。我基本上希望嵌套在Assets下的Assets表示为Component class而不是Asset。
我可以这样做吗?我认为这是更简单的方法,但我对其他建议(以及问题编辑)持开放态度,因为我可能会偏离逻辑和设计。
**更新**
以下是第一条评论的更多背景资料:
所以在我的Asset
节目控制器中,我故意添加了一个例外来说明这一点。这是我的网址:
从我的错误控制台我有:
>> @asset
=> #<Asset id: 5, assetable_id: 1, assetable_type: "Asset", name: "...>
>> url_for(@asset)
=> "http://localhost:3000/assets/5"
>> component_path(@asset)
=> "/components/5"
>> asset_path(@asset)
=> "/assets/5"
我知道我可以使用component_path(@asset)
但是url_for
如果我可以让Rails完成所有工作而不是每次我想添加{{1时不断添加一些条件逻辑我还看到我需要根据link_to
向我的路线添加一些条件,因为assessable_type
不应该出现在Assets
中,反之亦然。
答案 0 :(得分:1)
您可以考虑创建一个继承自Asset的Component类,以便您可以将所有这些存储在assets表中,但不同地对待它们。这通常称为单表继承。
http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
答案 1 :(得分:0)
您可以像这样定义组件路由:
resources :components, controller: 'assets', path: :components, as: :components, shallow: true#, only: [:index, :create, :new], defaults: { components: true }
这使用Specifying a Controller to Use的Rails Routing from the Outside In部分中描述的技术。它还使用同一指南的Defining Defaults部分中的defaults
选项通知控制器它正在使用组件路由,而不是资产路由。