2011-01-28 8 views
1

これはレールnewb質問です。私はcontent_type属性を持つContentsモデルを持っています。私のようなURLを使用してタイプを渡し、私はフィルタリングしたいと思い、いくつかの異なるCONTENT_TYPESを持っているので、:/内容CONTENT_TYPE =ブログ私はそうのようにそのパラメータに基づいてコンテンツを取得することができます理解Rails - URL paramがある場合にのみ内容を取得します

:?

@contents = Content.where({:content_type => params[:content_type]}) 

しかし、URLパラメータが存在しない場合は、コンテンツが取得されません。私は、URLのパラメータが渡されていないときに、型に関係なくすべての内容が取得されることを望んでいます。それ、どうやったら出来るの?

答えて

3

私はスコープを定義し、このように(あなたのモデルの中に)

class Content 

    scope :by_content_type, lambda { |contenttype| 
    where({:content_type => contenttype}) unless contenttype.blank? 
    } 

end 

と以下のように、あなたのコントローラでこれを使用します。

@contents = Content.by_content_type(params[:content_type]) 
+0

代わりにこれをお勧めします: 'contenttype.blank? ?スコープ:where(content_type:contenttype) ' – noodl

+0

私の意見では、条件のないスコープはスコープが定義されているので、必要ありません。 – nathanvda

+0

はい、大変申し訳ありません。 – noodl

2

これは動作するはずです:

 
if params[:content_type].blank? 
    @contents = Content.scoped 
else 
    @contents = Content.where({:content_type => params[:content_type]}) 
end 
+3

私はのように、その後 'むしろ.all''より.scoped'お勧めしたいのいずれかの分岐がスコープを返します。 rails-3では、 '#all'は簡単な配列を返します。 – noodl

+0

ありがとうございました。 –

+0

多くのおかげで、トリックをしました。また、+1、スコープの聞いたことがない、それを感謝します。 – jyoseph

0
@contents = Content.where({(:content_type => params[:content_type]} unless params[:content_type].blank?)) 
+0

これは、@contentsをnilに設定します。私は、フィルタのパラメータが指定されていない限り、ポスターがすべてのコンテンツを取得することを望んでいたと思います。 – Winfield

+0

このような素敵で清潔なものを望んでいましたが、Winfieldのようにそれはゼロを返します。 – jyoseph

+0

@Winfield:いいえ、それはフィルタリングされたか、またはスコープされた完全なセットを返します。かっこに注意してください。私はそれとすべてをテストしました:-) – noodl

1

は、クエリのparamsに基づいてフィルタを狭くする連鎖スコープのシリーズを使用して、ここで、合理的なパターンをtheresの:

@contents = Content.scoped # Start with no filter 

    # Optionally narrow filter if filter param is present 
    type = params[:content_type] 
    @contents = @contents.where(:content_type => type) if type 
関連する問題