2013-06-26 2 views
0

Я делаю приложение, в котором current_user (вошедший пользователь) может писать отзывы и делать обзор каждого из них общедоступным или закрытым, с помощью переключателя.нужна помощь с некоторым кодом рубинового массива, пожалуйста

Если публикация, каждый другой пользователь может увидеть этот обзор. Если частный, только current_user может это увидеть.

visible.true и visible.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 

#select Метод Array «s фильтрует заданный массив с условием, переданного в качестве блока. Я хотел бы переместить логику видимости на 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.

Edit: Использование сферы

#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

Cheers снова. Я пока придерживаюсь первого, поскольку я понимаю это лучше, но я знаю, что вы имеете в виду для того, чтобы держать View 'dumb'. Я прокомментировал в своем коде, чтобы в будущем вернуться к вопросу. Что касается моих отзывов_helper.rb, в которых содержится только код в моем вопросе, я просто удалил этот файл - мое приложение отлично работает без него, оно ничего не влияет. Вы думаете, что все в порядке, или я должен держать его в случае последствий на линии? – CHarris