Просто вопрос, связанный с лучшими практиками 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 изменяется на чтение
= render 'comments/list', :comments => limited_comments(post.comments)
Это работает, но не похоже на Rails. Я предполагаю, что есть способ с прицелами, но я не могу понять это.