Ruby on Rails: 读取属性的用户辅助方法

Ruby on Rails: User helper method to read attribute

我正在尝试使用辅助方法来确定多个记录的属性值。这是我试图开始工作的基本功能(从视图):

      <% if Baseline.where(subject_id: sub.subject_id).first.crf_status(crf) == 1 %> 
        <td bgcolor="#98FB98" >
      <% else %>

我的辅助函数是 crf_status(crf),它看起来像这样:

application_helper.rb

def crf_status(crf)
    case crf
    when Baseline then 'baseline_status'
    when FollowUp3Week then 'follow_up_3_week'
    ...
    end
end

所以一个工作示例是如果 crf_status(Baseline) 将 return:

      <% if Baseline.where(subject_id: sub.subject_id).first.baseline_status == 1 %> 
        <td bgcolor="#98FB98" >
      <% else %>

现在,错误是“基线的未定义方法 'crf_status'”。所以根据我读过的内容,也许我必须在每个控制器中引用 ApplicationHelper?这听起来不对。请告诉我你的想法。

谢谢。

编辑。我忘了说得更清楚:crf_status(crf) 正在从数组 [Baseline, FollowUp3Week...].

中传递一个对象

实际行也以此开头 -> if crf.where(subject_id:...

您在模型实例上调用 "crf_status",助手只能在视图和控制器上调用。

你必须这样做

<% if crf.where(subject_id: sub.subject_id).first.send(crf_status(crf)) == 1 %> 
  <td bgcolor="#98FB98" >
<% else %>

无论如何,这看起来像是一种奇怪的代码味道(在视图中进行查询是不正确的,crf_status 看起来像是您应该在模型中移动的东西)

当您像 .first.crf_status(crf) 那样进行方法链接时,您不会每次都获得一个新的全局范围。 IE。要使此示例正常工作,您的 crf_status 需要在 Baseline 模型上定义为实例方法。

从 MVC 设计的角度来看,从您的视图进行数据库查询(即 where)是不受欢迎的;您应该改为从控制器执行此操作。在这里使用助手的选择是完全可选的。通过将它放在一个帮助程序中,您所做的就是使其无法从您视图之外的代码访问。

切入正题,以下是您应该在 Baseline 模型文件中写入的内容:

def crf_status(crf)
    case crf
    when Baseline then baseline_status
    when FollowUp3Week then follow_up_3_week
    end
end

请注意 baseline_statusfollow_up_3_week 实际上是使用隐式接收器 self 的方法调用。

如果要return 一个要在上下文中调用的方法,请使用.send 方法。

Baseline.where(subject_id: sub.subject_id).first.send(crf_status(crf))

从您的方法中 return 得到的任何内容都将被执行。这是一个很棒的元编程示例。您想要针对实例的 class 进行测试,因此请在您的案例行中使用 .class 方法。你会想要 return 符号而不是字符串,所以这样做:

def crf_status(crf)
    case crf
    when Baseline then :baseline_status
    when FollowUp3Week then :follow_up_3_week
    else :default
    end
end

编辑:更改了类型比较的大小写