2013-06-26 38 views
0

我正在做一个应用程序,其中current_user(登录用户)可以写评论,并使每个审查公开或私人, 与单选按钮。需要一些红宝石阵列代码的帮助,请

如果公共,每个其他用户都可以看到该评论。如果是私有的,只有current_user可以看到它。

visible.truevisible.false,取决于选择哪个单选按钮。

我想要拿出代码/语法来得到这个工作?

喜欢的东西:

#review.user is the person who wrote a particular review 
    #if review.user is not current_user, and the review is 
    #marked as false, then don't show that review 
    If review.user != current_user 
    && review.visible = false 
    don't show review. 

目前在reviews_helper.erb我:

def review_block(review, options = {}) 
    options = {:review => review} 
    render 'reviews/review', options 
    end 

在我看来,show.html.erb:

<div class="reviews" > 
<% @reviews.each do |review| %> 
     <%= review_block review %> 
    <% end %> 
</div> 

任何你有可能告诉我应该如何修改我的帮手以使其工作,或者有其他建议吗?

+0

review.visible == false not review.visible = false – Deepika

回答

1

在这种情况下,你要到@reviews数组,你可以做这样的事情进行过滤:

@reviews.select { |review| review.visible_to?(current_user) }.each do |review| 
    render 'reviews/review', :review => review 
end 

Array#select方法过滤与为块传递的条件给定的阵列。我会的知名度逻辑移动到Review模型的方法调用visible_to?像你上面说的这是什么:

# review.rb 
def visible_to?(user) 
    self.user.id == user.id || # assuming they have an ID 
    visible == true 
end 

更重要的是,如果你是使用Rails可以完全从视图中删除select方法调用并在Review类中创建一个范围。

编辑:使用范围

#review.rb 
scope :visible_to, lambda { |user| conditions('user_id = ? or visible = ?', user.id, true) } 

这样,当你建立你的@reviews阵列 - 想必在一个控制器动作,你可以做这样的事情:

#reviews_controller.rb 
@reviews = Review.visible_to(current_user) 

可以很明显的嵌套几个范围 - 如订单,限制,在哪里等 - 并以您想要的方式过滤审查。尽管如此,实用程序visible_to?也应该为实例本身与范围一起定义。

请务必记住尽可能让自己的观点尽可能多,即您的观点应该最少了解您的模型和业务逻辑。这将确保您的视图和您的模型之间没有紧密的依赖关系。

+0

蒂亚戈,你是一个传奇人物!完美的作品。不确定你的意思是通过创建一个范围,它会查看它,但你的代码很好。我一直在研究这个项目一年,按照你的速度可以在一周内完成。随意来这里度假,我们会讨论铁轨,我会支付你的董事会和航班...这对我来说会更便宜,我发誓! – CHarris

+0

太棒了!我虽然没有检查。至于范围,它们是“ActiveRecord”框架的一部分,并允许您将SQL过滤器定义为“ActiveRecord”类及其产生的“ActiveRecord :: Relation”的一部分。我将用范围示例编辑我的答案。 – Tiago

+0

再次欢呼。我会暂时坚持第一个,因为我理解得更好,但我知道你的意思是保持视图的'愚蠢' - 我已经在我的代码中评论过以后回顾这个问题。至于我的reviews_helper.rb,其中只包含我的问题中的代码,我只是删除了该文件 - 我的应用程序没有它,它不会影响其他任何内容。你认为没关系,或者我应该保留它,以防下线的影响? – CHarris