Ruby on rails 只有导航依赖于控制器时布局的可用方法
给定带有导航栏的布局(取决于当前控制器):Ruby on rails 只有导航依赖于控制器时布局的可用方法,ruby-on-rails,partials,Ruby On Rails,Partials,给定带有导航栏的布局(取决于当前控制器): # layout.html.slim doctype html html body main = render partial: 'domain_nav' = yield 该应用程序有几个业务领域,比如“客户”、“任务”、“书籍”,它们有自己独特的导航(客户机导航,任务导航,书籍导航) 每个部件都有几个控制器,视图将显示基于控制器业务域的导航(例如,Clients::CompanyController将显示客户端导
# layout.html.slim
doctype html
html
body
main
= render partial: 'domain_nav'
= yield
该应用程序有几个业务领域,比如“客户”、“任务”、“书籍”,它们有自己独特的导航(客户机导航
,任务导航
,书籍导航
)
每个部件都有几个控制器,视图将显示基于控制器业务域的导航(例如,Clients::CompanyController将显示客户端导航
)
上面的html是简化的,但基本上,除了依赖于域的域导航
之外,所有控制器共享相同的布局
我看到了几种处理方法:
- 使用助手并根据控制器确定要使用的导航 名称:这意味着每次创建新控制器时都要编辑辅助对象 我觉得不太对劲
- 在每个视图中使用
,并且content\u:navigation
:因为我们确定每个视图都会显示导航, 这感觉也不对yield:navigation
- 每个部分使用一个子布局,并调用
:它可以工作,但i18n会变得一团糟渲染布局:“clients/layout”do
- 每个域定义一个布局:不是很干
- 使用单个布局并定义要在控制器中使用的nav(部分名称):该部分名称将使用 继承(每个域有一个控制器,用于设置nav部分 名称)或关注点
- 定义每个域的布局(在每个控制器中设置布局),但使用共享布局进行渲染,如下所示
有没有其他办法解决这个问题?您会选择哪一个以及原因?如果控制器可以按照其名称空间像导航名称一样进行分组,我将使用
“使用帮助器并根据控制器名称确定要使用的导航”
方法。例如,如果控制器名称以客户机
开头(例如,客户机::公司控制器
),我们可以轻松地将其映射到客户机导航
def nav_path
if params[:controller].starts_with? "Client"
'clients/nav'
elsif params[:controller].starts_with? "Task"
'tasks/nav'
else
'books/nav'
end
end
如果您不能按这样的名称空间对控制器进行分组,那么只有在您有管理面板的情况下,您仍然可以使用这种方法的不同变体。我们可以创建一个表,将
controller\u name
映射到navigation\u path
。此表上的条目只能从管理面板填充。我采用了另一种方式。因为它是控制器的责任来决定布局,我认为这将是rails的方式,让它也决定导航
就像有一个“布局”声明一样,我现在有一个“导航”声明。以下是控制器的外观:
class ClientsController < ApplicationController
navigation 'clients/nav'
…
end
class BooksController < ApplicationController
navigation 'books/nav'
…
end
导航方法在ApplicationController中声明:
class ApplicationController < ActionController::Base
helper_method :navigation
def self.navigation(path)
define_method :navigation do
path
end
end
end
class ApplicationController
这不是我想要的,但仍然是一个不错的解决方案,感谢您提交。您也可以使用控制器\u name
。它包含在参数中,告诉您哪个控制器调用了当前视图。@hashrocket我不是故意选择的。我觉得控制器应该告诉视图该做什么,而使用controller\u name
意味着让视图猜测该做什么。我完全理解。只是想把它作为另一个选项扔出去。@hashrocket ok:)
doctype html
html
body
main
= render partial: navigation
= yield
class ApplicationController < ActionController::Base
helper_method :navigation
def self.navigation(path)
define_method :navigation do
path
end
end
end