#ruby-on-rails #blogs #acts-as-taggable-on
#ruby-on-rails #Блоги #действует как тегируемый
Вопрос:
Я борюсь с acts_as_taggable gem для моего блога Rails 4 и надеюсь, что кто-нибудь может указать мне правильное направление. В режиме просмотра каждого сообщения я в настоящее время отображаю теги. Но под тегами я хочу отображать предварительные просмотры сообщений с одинаковыми тегами («Прочитайте больше сообщений о XYZ:»). Вот код, который у меня есть, который не работает:
tags_controller.rb:
def index
@tags = ActsAsTaggableOn::Tag.all
@posts = Post.tagged_with(@tag.name)
@related_posts = Post.tagged_with(@tag, :on => :tags)
end
posts_controller.rb:
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag])
else
@posts = Post.all
end
.
.
.
end
просмотры / сообщения /show.html.erb
<%= image_tag @post.image.url(:large) %>
<%= @post.title %>
<%= @post.subtitle %>
<%= @post.body.html_safe %>
<h3>Read more posts about: <%= render @post.tags %></h3>
<!-- This is where I want to display related posts: -->
<%= render 'tags/related' %>
просмотры / теги/_related.html.erb
<% @posts.each do |post| %>
<%= link_to image_tag(post.image.url(:small)), post%>
<%= link_to post.title, post %>
<% end %>
Это неправильно, потому что ВСЕ сообщения индексируются в рамках части _related.html.erb, а не только сообщения с одинаковыми тегами, которые отображаются в представлении показа этого отдельного сообщения. Я думал, поскольку я определил @posts как Post.tagged_with(@tag.name ) в контроллере тегов это сработало бы, но нет.
Ответ №1:
Отказ от ответственности: у меня очень базовые знания о ROR
Сегодня я столкнулся с той же проблемой и обнаружил, что, похоже, для этого определен метод, метод find_related_tags .
Итак, я думаю, что вы могли бы использовать в своих связанных представлениях что-то вроде:
просмотры / теги/_related.html.erb
<% @posts.find_related_tags.each do |post| %>
<%= link_to image_tag(post.image.url(:small)), post%>
<%= link_to post.title, post %>
<% end %>
В случае, если вы хотите ограничить результаты, которые вы можете использовать… @posts.find_related_tags.first(3).each…
Скорее всего, есть лучший способ ограничить вывод результатов, не уверен, но это то, что я использовал.
вы можете найти больше информации здесь:
Ответ №2:
По сути, вы хотите установить связь has_many от сообщения к сообщениям через теги.
Я бы создал метод в Post
модели, который генерирует массив связанных сообщений.
def related_posts
post_ary = Post.tagged_with(self.tags, :any => true)
post_ary.uniq.delete(self)
end
Обратите внимание на ключевые моменты в этом методе:
- вы не хотите включать само сообщение в список связанных сообщений — следовательно,
.delete(self)
acts_as_taggable_on
gem предоставляет несколько хороших методов поиска — вам следует ознакомиться с ними и посмотреть, есть ли что-нибудь еще, что вы хотите использовать
Затем используйте его в своем представлении
<h3>Read more posts about: <%= render @post.tags %></h3>
<!-- This is where I want to display related posts: -->
<%= render 'tags/related', locals { post: @post} %>
И в вашем частичном
<% post.related_posts.each do |rp| %>
<%= link_to image_tag(rp.image.url(:small)), rp %>
...
%>
сноски:
Вы должны представить те же действия контроллера, что и при просмотре — вы предоставили нам действие post / index, но представление post / show.
Комментарии:
1. Большое вам спасибо за этот подробный и полезный ответ. У меня есть 2 вопроса: 1) нужны ли мне has_many: связанные сообщения в модели post? 2) Я разместил код post.rb, который вы указали в моей модели post. По какой-то причине я просто не могу понять, я получаю ошибку «undefined method `related_posts'» при загрузке страницы показа сообщений. Есть идеи, что я могу делать неправильно? Еще раз спасибо за ваше время.
2. 1) Нет, вам определенно НЕ нужны сообщения, связанные с has_many.
related_posts
это метод, а не взаимосвязь. 2) Откройте консоль rails (rails c
), загрузите сообщение с помощьюpost = Post.first
, а затем введитеpost.related_posts
3. Спасибо. Я также получаю эту ошибку в консоли: «NoMethodError: неопределенный метод `posts’ для #<ActsAsTaggableOn::Tag:0x007f88a7eb3f48>»
4. Ох. Тогда тегируемый драгоценный камень не работает так, как я предполагаю… Просматривая документы, вы должны использовать
.tagged_with()
метод. Я отредактирую свой ответ.