Ruby on rails RubyonRails:将数组值存储在变量中并用作字符串

Ruby on rails RubyonRails:将数组值存储在变量中并用作字符串,ruby-on-rails,arrays,hash,Ruby On Rails,Arrays,Hash,我正在重构一些代码。我试图在视图中使用数组作为for循环的一部分,该循环在表中生成列 我已在控制器中定义了阵列: 受试者控制器.rb def index ... @CRFS_TO_VIEW = [Baseline, TreatmentCompletion] @CRF_PATH = {Baseline => 'baseline_path', TreatmentCompletion => tc_path} end 所以我的目标;当函数在@CRFS_TO_视图上迭

我正在重构一些代码。我试图在视图中使用数组作为for循环的一部分,该循环在表中生成列

我已在控制器中定义了阵列:

受试者控制器.rb

def index
    ...
    @CRFS_TO_VIEW = [Baseline, TreatmentCompletion]
    @CRF_PATH = {Baseline => 'baseline_path', TreatmentCompletion => tc_path}
end
所以我的目标;当函数在@CRFS_TO_视图上迭代时,将从@CRF_path中选择正确的路径并将其附加到链接_TO函数

index.html.erb

<% @CRFS_TO_VIEW.each do |crf| %>
  <% path = @CRF_PATH[crf] %>
  <%= link_to "edit", path(crf.where(subject_id: sub.subject_id).first %>
<% end %>

我还尝试:

<%= link_to "edit", @CRF_PATH[crf](crf.where(subject_id: sub.subject_id).first %>

这没用。我觉得我必须接近,任何帮助或见解都将不胜感激

谢谢。

有几件事:

a。您应该节省一些时间,通过字典而不是数组进行循环:

<% @CRF_PATH.each do |crf, path| %>
...
<% end %>
c。您可以使用以下方法简化对对象的检索:

crf.find_by(subject_id: sub.subject_id)
也就是说,这似乎是一种非常糟糕的做事方式。我建议改为添加视图帮助器:

def crf_path(crf)
  case crf
  when Baseline then baseline_path(crf)
  ...
end
有了这样的功能,您可以使用(注意为了安全起见,将
find_by
更改为
find_by!
):


最后,实例变量不应命名为大写。如果要使用常量,请将其定义为常量(否则请使用小写名称)。

以下几点:

a。您应该节省一些时间,通过字典而不是数组进行循环:

<% @CRF_PATH.each do |crf, path| %>
...
<% end %>
c。您可以使用以下方法简化对对象的检索:

crf.find_by(subject_id: sub.subject_id)
也就是说,这似乎是一种非常糟糕的做事方式。我建议改为添加视图帮助器:

def crf_path(crf)
  case crf
  when Baseline then baseline_path(crf)
  ...
end
有了这样的功能,您可以使用(注意为了安全起见,将
find_by
更改为
find_by!
):



最后,实例变量不应命名为大写。如果要使用常量,请将其定义为常量(否则请使用小写名称)。

@CRFS\u to\u视图
数组中,元素不应该是字符串吗?比如
@CRFS\u TO\u VIEW=['Baseline','treatmentcompletion']
。与
@CRF_PATH
相同。可能是这样,我一定会尝试一下。但在此之前,将@CRF_PATH[CRF]保存到PATH不起作用。路径未标识。也许我不能在视图中声明变量?所以@CRFS\u TO\u视图不起作用,因为这些项不是字符串。它们是对控制器的引用。在
@CRFS\u TO\u视图
数组中,元素不应该是字符串吗?比如
@CRFS\u TO\u VIEW=['Baseline','treatmentcompletion']
。与
@CRF_PATH
相同。可能是这样,我一定会尝试一下。但在此之前,将@CRF_PATH[CRF]保存到PATH不起作用。路径未标识。也许我不能在视图中声明变量?所以@CRFS\u TO\u视图不起作用,因为这些项不是字符串。它们是对控制器的引用。这样,Baseline.create(id)就可以工作了。这非常有用。我甚至认为我不能用这种方式使用视图助手。我想这就是我一直在寻找的答案,我花了一些时间在这上面,也许会问你一两个问题。非常感谢。这些视图帮助程序是否仅适用于rails 4.0及更高版本?或者更好的问题是,我把助手放在哪里?@IanEllis你可以把它们放在
app/helpers/application\u helper.rb
下。这非常有用。我甚至认为我不能用这种方式使用视图助手。我想这就是我一直在寻找的答案,我花了一些时间在这上面,也许会问你一两个问题。非常感谢。这些视图帮助程序是否仅适用于rails 4.0及更高版本?或者更好的问题是,我把助手放在哪里?@IanEllis你可以把它们放在
app/helpers/application\u helper.rb
下。