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

时间:2016-09-08 18:40:35

标签: ruby-on-rails arrays hash

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

我在控制器中定义了数组:

subjects_controller.rb

def index
    ...
    @CRFS_TO_VIEW = [Baseline, TreatmentCompletion]
    @CRF_PATH = {Baseline => 'baseline_path', TreatmentCompletion => tc_path}
end

所以我的目标;当函数迭代@CRFS_TO_VIEW时,从@CRF_PATH中选择正确的路径并附加到link_to函数。

indext.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 %>

哪个不起作用。我觉得我必须越来越近,任何帮助或见解将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:2)

一些事情:

一个。你应该节省一些时间并循环遍历字典而不是数组:

<% @CRF_PATH.each do |crf, path| %>
...
<% end %>

湾您从循环中获取一个字符串 - 您可以使用send

调用等效方法
<%= send(path, ...) %>

℃。您可以使用以下方法简化对象的检索:

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_TO_VIEW.each do |crf| %>
  <%= link_to "edit", crf_path(crf.find_by!(subject_id: sub.subject_id) %>
<% end %>

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