Драгоценный камень Acts_as_taggable: как отображать миниатюры сообщений с одинаковым тегом на странице показа каждого сообщения?

#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…
Скорее всего, есть лучший способ ограничить вывод результатов, не уверен, но это то, что я использовал.

вы можете найти больше информации здесь:

rubydoc

Ответ №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() метод. Я отредактирую свой ответ.