2013-06-26 37 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