2017-04-19 50 views
1

我在我的控制器代碼,我想對非授權用戶過濾掉一些記錄:加入搜索參數,如果條件爲真

unless admin_signed_in? 
    @posts = Post.where(hidden: false) 
else 
    @posts = Post.all 
end 

我試圖重構這一點,但不能做出正確的查詢

@posts = Post.where(hidden: if admin_signed_in? ? true : false) 

輸出:

.../app/controllers/posts_controller.rb:7: syntax error, unexpected ')', expecting keyword_then or ';' or '\n' in_signed_in? ? true : false) 
+0

嘗試沒有'if':'@posts = Post.where(隱藏:admin_signed_in真:??假)

但是,你可以用三元運算符代替它' –

回答

5

你有一個語法錯誤。您正在使用ifternary (? :)。只需將其更改爲

@posts = Post.where(hidden: admin_signed_in?) 

你並不需要通過truefalse手動

注: 但是,它不會返回你hidden = false如果admin_signed_in?返回true

職位因此,您可能需要將其更改爲

@posts = Post.where(({hidden: true} if admin_signed_in?)) 
2

我認爲你的重構將不起作用,因爲Post.all將不會返回與Post.where(hidden: true)相同的結果。後者將只列出隱藏但不可見的帖子。

我會重構代碼是這樣的:

@posts = Post.all 
@posts = @posts.where(hidden: false) unless admin_signed_in? 
+0

我刪除了所有附加方法之前張貼我的問題 – CannyFoxx

3

與三元的問題是 「如果」

@posts = Post.where(hidden: if admin_signed_in? ? true : false) 

應該

@posts = Post.where(hidden: admin_signed_in? ? true : false) 

當然你可以考慮發佈其他解決方案。

斯特凡指出,管理員只能看到隱藏的帖子,不是所有的職位,所以如果你要堅持三元那麼你真的想...

@posts = Post.where(hidden: admin_signed_in? ? [true, false, nil] : false) 
+0

注意:管理員將只會看到隱藏的帖子。 – Stefan

+0

@stefan好點,回答編輯。 – SteveTurczyn

1

unlesselse相當混亂。我會改變它:

if admin_signed_in? 
    @posts = Post.all 
else 
    @posts = Post.where(hidden: false) 
end 

除此之外,我認爲代碼讀取就好了。

@posts = admin_signed_in? ? Post.all : Post.where(hidden: false)