2016-04-10 34 views
0

我有一个组织模型,其中有一个属性,称为org_type。在我的组织形式中,我要求用户指定他们的组织类型是大学,学院还是其他类型的组织。在我的演出页面中,如果组织类型是大学或大学,我想显示一些文本。Rails 4 - 或者如果声明

我不能得到任何或功能的工作。如果我只是要求检查一个组织类型,下面例如,它工作正常:

<% if @organisation.org_type == 'University' %> 

如果我要求任何组织类型,它显示一切即使在测试组织是“其它”:

<% if @organisation.org_type == 'University' or 'College' %> 

上述不起作用。它显示组织类型为“其他”的文本。

任何人都可以看到我做错了什么吗?

回答

1

在视图中的逻辑像冒着变得复杂和难以维护的风险。它总是以对这些情况的一次检查开始,然后被复制到半打地方,然后情况变为“单身,大学或自学”,并且你必须找到你使用过的所有地方它。

更好的是将它提取到模型中的方法,然后让视图只是询问模型。

# Organisation model 
def uni_or_college? 
    %w(University College).include? org_type 
end 

# view 
<% if @organisation.uni_or_college? %> 
    ... 
<% end %> 

这也是一个检验的方法 - 如果你有测试,确保.uni_or_college?方法返回要的是什么,如果(当)的要求,改变未来,你有一个安全网,以帮助您重构。

+0

进一步沿着可维护的代码路径走一步,最好提取uni_or_college中使用的常量?方法转换成适当的常量,然后可以引用它。 HIGHER_EDUCATION =%w(大学学院)。 def uni_or_college ?; HIGHER_EDUCATION.include? org_type;结束。 – margo

+0

帕夫林的回答非常好。这也是我所做的。我用它们来写......如果[“大学”,“大学”]。包括?(org_type)......或预制像Institutions.where(:type => [.. ....])。select(:type).collect {| i | i.type}如果我想从现有记录 –

+0

@margo构建的列表或组织模型的子类 - 将条件替换为类型。但一次一步:-) – Pavling

2

如果条件是两个单独的条件,则实际上rails会运行在下面。

<% if @organisation.org_type == 'University' or 'College' %> 

@organisation.org_type == 'University'是真的OR'College'

手段,<% if (@organisation.org_type == 'University') || ('College') %>

要克服这种情况,你可以做这样的事情:

<% if ['University', 'College'].include?(@organisation.org_type) %> 

这将返回如果@organisation.org_type要么是 '大学' 或 '学院'。其他false