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_status
和 follow_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
编辑:更改了类型比较的大小写
我正在尝试使用辅助方法来确定多个记录的属性值。这是我试图开始工作的基本功能(从视图):
<% 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_status
和 follow_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
编辑:更改了类型比较的大小写