我的控制器中有代码,我希望为非授权用户过滤一些记录:
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 :(得分:4)
您遇到语法错误。您正在使用if
和ternary (? :)
。只需将其更改为
@posts = Post.where(hidden: admin_signed_in?)
您无需手动传递true
和false
注意:强>
但是,如果hidden = false
返回true
admin_signed_in?
的帖子
因此,您可能希望将其更改为
@posts = Post.where(({hidden: true} if admin_signed_in?))
答案 1 :(得分:2)
我认为您的重构不起作用,因为Post.all
不会返回与Post.where(hidden: true)
相同的效果。后者只会列出 隐藏但不可见的帖子。
我会将代码重构为:
@posts = Post.all
@posts = @posts.where(hidden: false) unless admin_signed_in?
答案 2 :(得分:2)
三元的问题是“如果”
@posts = Post.where(hidden: if admin_signed_in? ? true : false )
应该是
@posts = Post.where(hidden: admin_signed_in? ? true : false )
当然,您可以考虑发布的其他解决方案。
Stefan指出,管理员只会看到隐藏的帖子,而不是所有帖子,所以如果你要坚持使用三元组,那么你真的想要......
@posts = Post.where(hidden: admin_signed_in? ? [true, false, nil] : false )
答案 3 :(得分:0)
unless
的 else
非常令人困惑。我将其更改为:
if admin_signed_in?
@posts = Post.all
else
@posts = Post.where(hidden: false)
end
除此之外,我认为代码读起来还不错。
但是,您可以用三元运算符替换它:
@posts = admin_signed_in? ? Post.all : Post.where(hidden: false)