ActionView::SyntaxErrorInTemplate at /template_name



我需要根据目录名的存在将侧边栏的内容动态加载到侧边栏部分中,该目录名间隔为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/homesidebars/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}" %>

相关内容

  • 没有找到相关文章

最新更新