我正在尝试在show.html.erb页面中编写一个方法,该方法对第一个if条件有两个布尔条件。
我有:
<% if @project.requires_educator_approval && @project.educator_approved == false %>
<p>Approved</p>
<% elsif @project.requires_educator_approval && @project.approval_requested && @project.educator_approved == false %>
<p>Approval requested</p>
<% elsif @project.requires_educator_approval && @project.approval_requested == false %>
<p>Approval request pending</p>
<% elsif @project.requires_educator_approval == false %>
<p>No approval required</p>
<% else %>
<p>TBC</p>
<% end %>
我认为上述情况并不正确,但我仍然不知道如何处理它。
我在数据库中为每个条件都有布尔属性(所以我想我可以用?来检查它是否属实,但是有没有!?来检查它是不是真的?)
有没有人对如何解决这个问题有更好的想法?
非常感谢。
答案 0 :(得分:1)
逻辑对我来说很好。对于逻辑非,您可以在代码中使用!if
或unless
。要直接回答您的第一个问题,不能,您只需附加一个问号来检查真假与否。在Rails中,最好是只调用对象上的属性,或者,如果您想要明确,可以调用present?
或blank?
作为present?
如果值设置/设置为true,则返回true;如果值为blank?
或nil
,则false
返回true。
我个人不喜欢视图中的那么多逻辑,所以我会把它作为辅助方法:
# app/helpers/application_helper.rb
def approval_helper(project)
approval_string = "TBC"
approval_string = if project.requires_educator_approval
if project.approval_requested
if project.educator_approved
"Approved"
else
"Approval Requested"
end
else
"Approval Request Pending"
end
else
"No approval required."
end
end
然后在您看来,请致电:
<%= approval_string(@project) %>
答案 1 :(得分:0)
最好在可能的情况下将逻辑排除在视图之外。 将逻辑移动到控制器并为要显示的文本创建变量。
<强>控制器:强>
@approval_status = nil
if @project.requires_educator_approval && @project.educator_approved == false
@approval_status = "Approved"
elsif @project.requires_educator_approval && @project.approval_requested && @project.educator_approved == false
@approval_status = "Approval requested"
elsif @project.requires_educator_approval && @project.approval_requested == false
@approval_status = "Approval request pending"
elsif @project.requires_educator_approval == false
@approval_status = "No approval required"
else
"TBC"
end
查看:强>
<p><%= @approval_status %></p>
Ruby有&#34的关键字;如果不是&#34;被称为
的情况unless
答案 2 :(得分:0)
首先确保为数据库中的布尔字段设置了默认值。虽然没有正确的规范化,但这有助于您避免不断检查nil?
要回答您的问题,您可以检查无条件......
<% if @project.requires_educator_approval && !@project.educator_approved %>
<p>Approved</p>
<% elsif @project.requires_educator_approval && @project.approval_requested && ! @project.educator_approved %>
<p>Approval requested</p>
<% elsif @project.requires_educator_approval && !@project.approval_requested %>
<p>Approval request pending</p>
<% elsif !@project.requires_educator_approval %>
<p>No approval required</p>
<% else %>
<p>TBC</p>
<% end %>
说完所有这些......你可能想要在帮助器方法中使用case语句,或者如果elsif elsif中有很多其他的......否则重写为&#34;二进制字符串&#34;并获得一个整数值,然后您可以更容易地找出(基本上是位掩码)。这是一种你可以做到的肮脏的方式。
def change_to_string(boolean_value)
raise ArgumentError unless boolean_value.is_a?(Boolean)
boolean_value ? '1' : '0'
end
calc_as_integer = [
change_to_string(@project.requires_educator_approval),
change_to_string(@project.approval_requested),
change_to_string(@project.educator_approved)
].join.to_i(2)
<% if calc_as_integer == 5 %>
<p>Approved</p>
<% elsif 6 %>
<p>Approval requested</p>
<% elsif 4 %>
<p>Approval request pending</p>
<% elsif 1 %>
<p>No approval required</p>
<% else %>
<p>TBC</p>
<% end %>
这是一种愚蠢的做法,但通过一些实验,你可以处理所有的组合。还可以查看Railscast的bitmask剧集。