2016-04-10 9 views
0

私はorg_typeという属性を持つ組織モデルを持っています。私の組織形式では、組織タイプが大学、大学、その他の組織であるかどうかを指定するようユーザーに求めます。私のショーページでは、組織タイプが大学または大学の場合はテキストを表示したいと考えています。Rails 4 - if文またはif文

私はそのいずれかの機能を動作させることができません。私はちょうどそのような以下のように、1つの組織の種類を確認するように依頼した場合、それが正常に動作します:

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

私は組織型のいずれかを求める場合は、テスト組織が「その他」であっても、すべてを示しています

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

上記は機能しません。組織タイプが「その他」のテキストが表示されます。

私は間違ったことを誰にでも見せてもらえますか?

答えて

1

ロジックが複雑になり、メンテナンスが難しいようなビューのロジック。それは常に条件のカップルのためのちょうど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

Pavlingの答えは優れています。これが私のやり方です。 ["University"、 "College"]。?(org_type)をインクルードするか、Institutions.where(:type => [.. ..]のような配列をあらかじめ構築しておくと、 ....])。select(:type).collect {| i | i.type}既存のレコード –

+0

@margoまたはOrganizationモデルのSubClassesから構築されたリストを必要とする場合、条件付きをtypeに置き換えます。しかし、一歩一歩:-) – Pavling

2

レールは実際には2つの別々の条件として以下の条件で実行されます。

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

@organisation.org_type == 'University'OR'College'です。このような状況を克服するために

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

、あなたはそのようなこと行うことができます:@organisation.org_typeは '大学' や '大学' のいずれかである場合には、を返します

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

を。 Else false