我最近开始使用引擎分解我的一些应用程序我在我正在使用的共享部分中的某些链接的路由中遇到了一些问题。部分如下所示:
shared/delete_link.html.erb
<%= link_to object,
method: :delete,
data: { confirm: 'Are you sure?' } do%>
<span class="glyphicon glyphicon-remove"></span>
<% end %>
我像这样称呼部分;将我想要删除的对象传递给它:
<%= render "shared/delete_link", :object => search %>
这适用于仍在主应用程序中的模型/路线,但现在我遇到这样的情况:
|-controller(main-app)
|--show(main-app)
|---partial(engine)
|----partial-delete-link(main-app)
|-----link-route(engine)
其中部分由主应用程序中的控制器呈现,其中包含引擎中路由的删除链接。唯一重要的是(我认为)控制器在主应用程序中,对象的路由在已安装的引擎中,因此需要将其命名为命名空间。
如何在不将大量逻辑放入视图中的情况下恢复功能?
重构时不要过度。
使用部分创建单个元素几乎不是最佳选择。相反,您可以只创建一个帮助程序方法:
module LinksHelper
def link_to_destoy(object, **kwargs)
opts = {
method: :delete,
data: { confirm: 'Are you sure?' }
}.deep_merge(kwargs)
link_to object, opts do
content_tag :span, class: 'glyphicon glyphicon-remove'
end
end
end
通过使用方法,您可以轻松创建一个包装器,该包装器在填充默认参数时代理到另一个方法。在比较中,部分适用于大块的html,但在变量传递和组合方面仍然很混乱。
要在 rails 中创建指向命名空间路径的链接,请传递一个数组:
# /foos/bars/:id
<%= link_to_destoy([:foo, bar]) %>
# /foos/:foo_id/bars/:id
<%= link_to_destoy([foo, bar]) %>