部分名称 (sets/3/0) 不是有效的 Ruby 标识符

The partial name (sets/3/0) is not a valid Ruby identifier

我试图在我的应用程序中呈现一系列相当复杂的部分,但收到以下错误消息:

The partial name (sets/3/1) is not a valid Ruby identifier; make sure your partial name starts with underscore, and is followed by any combination of letters, numbers and underscores.

这部分是从我的 generators#show 操作中呈现的,使用以下代码:

<% @random_partial = 'sets/' + bucket.to_s + '/' + rand(2).round.to_s %>
<%= render partial: @random_partial %>

bucket 是一个数字(介于 1 和 7 之间,无关紧要),随机数是从 bucket 中的任何内容中选择一个随机部分。当前的文件结构如下所示:

generators
|--exercises
    |--_cardio0.html.erb
    |--_cardio1.html.erb
    |--_weight0.html.erb
    |--_weight1.html.erb
|--sets
    |--1
       |--_0.html.erb
       |--_1.html.erb
    |--2
       |--_0.html.erb
       |--_1.html.erb
    |--3
       |--_0.html.erb
       |--_1.html.erb
    |--4
       |--_0.html.erb
       |--_1.html.erb
    |--5
       |--_0.html.erb
       |--_1.html.erb
    |--6
       |--_0.html.erb
       |--_1.html.erb
    |--7
       |--_0.html.erb
       |--_1.html.erb
|--new.html.erb
|--show.html.erb

最后,我认为这不会影响显示的错误,但这是 sets 部分之一的示例:

<% @random_cardio_1 = 'exercises/_cardio' + rand(2).round.to_s %>
Five Minutes of <%= render partial: @random_cardio_1 %>

<% @random_cardio_2 = 'exercises/_cardio' + rand(2).round.to_s %>
Five Minutes of <%= render partial: @random_cardio_2 %>

<% @random_cardio_3 = 'exercises/_cardio' + rand(2).round.to_s %>
Five Minutes of <%= render partial: @random_cardio_3 %>

其他人能弄清楚为什么会生成此错误或如何更正此代码吗?

我刚刚测试发现我们不能像你的那样有一个以整数作为名称的部分 Rails 4. 你的代码有一些问题。

首先,我们参考app/views之后使用相对目录的部分。所以在路径的开头添加 generators/

其次,正如我之前提到的,您不能使用整数作为部分名称,请将您的部分重命名为其他名称。例如,我会将 p 添加到名为 partials 的整数中。所以 _1.html.erb 将重命名为 _p1.html.erb.

第三,在引用你的部分时不要添加额外的_。这个'generators/sets/' + bucket.to_s + '/' + rand(2).round.to_s可以,但是这个<% @random_cardio_3 = 'exercises/_cardio' + rand(2).round.to_s %>不行。

所以你可以渲染它,

<% @random_partial = 'generators/sets/' + bucket.to_s + '/p' + rand(2).round.to_s %>
<%= render partial: @random_partial %>

并且对于 cardio

之前的嵌套部分删除 _
<% @random_cardio_3 = 'generators/exercises/cardio' + rand(2).round.to_s %>
Five Minutes of <%= render partial: @random_cardio_3 %>