Rails if语句有多个布尔属性

时间:2015-01-26 03:12:47

标签: ruby-on-rails ruby

我正在尝试在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 %>

我认为上述情况并不正确,但我仍然不知道如何处理它。

我在数据库中为每个条件都有布尔属性(所以我想我可以用?来检查它是否属实,但是有没有!?来检查它是不是真的?)

有没有人对如何解决这个问题有更好的想法?

非常感谢。

3 个答案:

答案 0 :(得分:1)

逻辑对我来说很好。对于逻辑非,您可以在代码中使用!ifunless。要直接回答您的第一个问题,不能,您只需附加一个问号来检查真假与否。在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剧集。