我需要根据目录名的存在将侧边栏的内容动态加载到侧边栏部分中,该目录名间隔为controller_name
(如果存在(和action_name
(始终使用(。它们都是从Rails哈希派生的,如果有controller_name
的目录,则映射到.../views/sidebars/[controller_name]/[action_name]
;如果没有与Controller名称同名的关联目录,则它们映射到.../views/sidebars/[action_name]
。
/views
/sidebars
/static
/_about.html.erb
/_contact.html.erb
/...
/_styles.html.erb #outside of any controller structure
我正在尝试使用以下代码动态加载正确的侧边栏部分:
<%= "sidebars/#{controller_name}".to_s.present? ? yield("sidebars/#{controller_name}/#{action_name}" : yield("sidebars/#{action_name}") %>
这将检查是否存在controller_name
调用的目录,并根据指示的结构呈现正确的分部。
我得到以下错误:
Encountered a syntax error while rendering template: check <div id='sidebar_left'>
<p>Template: [_sidebar-left.html.erb]</p>
<%= render "sidebars/#{action_name}" %>
<%= "sidebars/#{controller_name}".to_s.present? ? yield("sidebars/#{controller_name}/#{action_name}" : yield("sidebars/#{action_name}") %>
更新
好的,事实证明,三元运算符并不总是返回值,特别是如果它是一个计算的字符串值。在这种情况下,我期望值以sidebars/static/home
或sidebars/styles
的形式返回。出于某种原因,我无法解释,三元运算符不能以这种方式工作,尽管我(心想!(从操作中返回了一个字符串值。
为了消除语法错误,我必须将运算符分配给一个变量名,在本例中为sb_name
,然后在下一行中呈现它。这是最后一个代码:
<% sb_name = "sidebars/#{controller_name}".to_s.present? ? "sidebars/#{controller_name}/#{action_name}" : "sidebars/#{action_name}" %>
<%= render sb_name %>
现在,虽然这解决了语法错误,但我现在在视图中得到了一个Missing partial sidebars/_about
错误。_styles
文件以/views/sidebars/_styles.html.erb
的形式存在,就在它应该存在的位置。由于没有与被调用的控制器间隔开的文件夹名称(在本例中为StylesController
(,因此它应该直接将文件拉到/sidebars/
目录下。然而,事实并非如此。
我在这里找到了一些关于SO的帮助。我没有正确检查目录/文件结构。最后的语法是:
<% sb_name = File.directory?("app/views/sidebars/#{controller_name}") ? "/sidebars/#{controller_name}/#{action_name}" : "/sidebars/#{action_name}" %>
<%= render partial: "#{sb_name}" %>