我正在重构一些代码。我试图在我的视图中使用数组作为在表中创建列的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 %>
哪个不起作用。我觉得我必须越来越近,任何帮助或见解将不胜感激。
感谢。
答案 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 命名为大写。如果要使用常量将其定义为常量(否则使用小写名称)。