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>

ヘルパーを機能させるためにどのように変更すればよいか、またはその他の提案を教えていただけないでしょうか?

4

1 に答える 1

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?メソッドは、スコープと共にインスタンス自体に対しても定義する必要があります。

ビューをできる限り馬鹿げたものにすることを常に心に留めておいてください。つまり、ビューはモデルとビジネス ロジックについて最小限しか知らない必要があります。これにより、ビューとモデルの間に密接な依存関係がなくなります。

于 2013-06-26T11:37:32.970 に答える