2

Rails のベスト プラクティスに関する質問です。

Post モデルと Comment モデルがあるとします。index ビューと show ビューの両方で投稿をレンダリングするために、同じパーシャルが使用されます。そのパーシャル内には、コメントをレンダリングする別のパーシャルへの参照があります。

post_controller.rb

def index
  @posts = Post.all
end

def show
  @post = Post.find(params[:id])
end

_post.html.haml

.post
  = post.content 
  = render 'comments/list', :comments => post.comments

コメント/_list.html.haml

- comments.each do |c|
    c.comment

投稿のインデックス ビューでは、各投稿の最後の 3 つのコメントのみを表示したいとしますが、ショー ビューでは投稿のすべてのコメントを表示したいとします。同じパーシャルが使用されているため、呼び出しを編集してコメントを制限することはできません。これを達成するための最良の方法は何ですか?現在、これをヘルパーに抽象化しましたが、少し危険な感じがします:

def limited_comments(comments)
  if params[:controller] == 'posts' and params[:action] == 'show'
    comments
  else
    comments.limit(3)
  end
end

つまり、_post.html.hamlが read に変更されます

= render 'comments/list', :comments => limited_comments(post.comments)

動作しますが、Rails のやり方とは思えません。スコープには方法があると思いますが、それを理解できないようです。

4

2 に答える 2

1

@benchwarmerが言いたかったのは、_postpartialにパラメーターを渡す方が良いということだと思います。単純な@commentsは機能しませんが、以下のコードのようなものは次のようになります。

def index
  @posts = Post.all
  render :partial => @posts, :locals => { :max_comments => 3 }
end

def show
  @post = Post.find(params[:id])
  render :partial => @post, :locals => { :max_comments => false }
end

post.html.haml:

= render 'comments/list', :comments => limited_comments(post.comments,max_comments)

あなたのヘルパー:

def limited_comments(comments,max_comments)
  max_comments ? comments.limit(max_comments) : comments
end

私はコンパイルしなかったので、:partialをレンダリングするために渡すパラメーターをさらに処理する必要があるかもしれません(この場合は:partialと:object /:collectionを別々に設定する必要があるかもしれません。覚えていないし、試していません)。しかし、私はその考えが明確であることを願っています-論理表現(すべてのコメントまたは最後の3つ)を処理パス(どのコントローラー/アクション)から分離してください。後でコメントが埋め込まれた投稿(ユーザーのリストの最後の3つの投稿)を表示したい場合は、そのような分離が便利です。

コントローラレベルですべての内部論理詳細を公開したくない場合は、次のようにsmthを実行することもできます。

def index
  @posts = Post.all
  render :partial => @posts, :locals => { :comments_list_type => :short }
end

def show
  @post = Post.find(params[:id])
  render :partial => @post, :locals => { :comments_list_type => :full }
end

次に、post.html.hamlで:

= render 'comments/list', :comments => build_comments_list(post.comments,comments_list_type)

あなたのヘルパー:

def limited_comments(comments,comments_list_type)
  case comments_list_type
    when :short
      comments.limit(3) 
    when :long
      comments.limit(10) 
    when :full
      comments
  end
end
于 2013-02-27T22:24:49.120 に答える
1

index アクションで 3 つのコメントを保持し、@comments変数に割り当てることができます。show アクションでは、その投稿のすべてのコメントを読み込むことができます。だからそれはなる

def index
  @posts = Post.all
  @comments = Comment.order("created_at desc").limit(3)
end

def show
  @posts = Post.all
  @comments = @post.comments.order("created_at desc").limit(3)
end

ビューでは、単純に

= render 'comments/list', :comments => @comments
于 2013-02-27T17:29:47.280 に答える