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
    :因为我们确定每个视图都会显示导航, 这感觉也不对
  • 每个部分使用一个子布局,并调用
    渲染布局:“clients/layout”do
    :它可以工作,但i18n会变得一团糟
  • 每个域定义一个布局:不是很干
  • 使用单个布局并定义要在控制器中使用的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