我正在创建一个应用,其中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 :(得分:1)
如果您要过滤@reviews
数组,可以执行以下操作:
@reviews.select { |review| review.visible_to?(current_user) }.each do |review|
render 'reviews/review', :review => review
end
Array
的{{1}}方法过滤给定数组,条件传递为块。我会将可见性逻辑移到#select
模型到方法调用Review
,这可能就像你上面说的那样:
visible_to?
更好的是,如果您使用的是Rails,则可以从视图中完全删除# review.rb
def visible_to?(user)
self.user.id == user.id || # assuming they have an ID
visible == true
end
方法调用,并在Review类中创建一个范围。
编辑:使用范围
select
这样,当您构建 #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)
方法。
始终牢记尽可能让您的观点成为笨蛋,即您的观点应该至少了解您的模型和业务逻辑。这将确保您的视图与模型之间没有严格的依赖关系。