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>

你有没有机会告诉我应该如何修改我的助手以使其正常工作,或任何其他建议?

4

1 回答 1

1

如果您想过滤@reviews数组,您可以执行以下操作:

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

' Arrays#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?方法也应该与范围一起为实例本身定义。

始终牢记让您的视图尽可能地笨拙,即您的视图应该对您的模型和业务逻辑了解最少。这将确保您的视图和模型之间没有紧密的依赖关系。

于 2013-06-26T11:37:32.970 回答