2014-12-23 5 views
0

Я хочу получить все твиты, которые имеют определенный хэштег в них. Сначала я добавляю хештегов в моих 2 таблицы:Маршрутизация и поиск db ruby ​​

def add_hashtags(tweet) 
     tweet.content.scan(/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/){ |tag| 
     @allhashes = Hashtag.all 
     @hash = Hashtag.find_by_name(tag[0].strip) 
     unless @hash 
      @hashtag = Hashtag.new(name: tag[0].strip) 
      @hashtag.save 
      @hashrel = Hashrelation.new(tweet_id: tweet.id, hashtag_id: @hashtag.id) 
      @hashrel.save 
     else 
      @hashrel = Hashrelation.new(tweet_id: tweet.id, hashtag_id: @hash.id) 
      @hashrel.save 
     end 
     } 
    end 

, то я хочу, чтобы маршрут к шоу метода контроллера твит:

get 'tweets/show/(.:format)' => 'tweets#show', as: :hashtag 

Ссылки в хэштегов являются следующие:

def twitify(tweet = '') 
     tweet.gsub(/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/) do |tag| 
     " " + link_to("#{tag.strip}", hashtag_path(tag.strip), {:name => tag.strip}) 
     end.html_safe 
    end 

И, наконец, показать способ контроллера твит:

def show 
    @hashtag = Hashtag.find_by_name(params[:name]) 
    @tweet_ids = Hashrelation.find_by_hashtag_id(@hashtag.id) 
    @feed_items = Tweet.find_by_id(@tweets_ids.id) 
    end 

Когда я нажимаю на ссылку, я получаю:

undefined method `id' for nil:NilClass 

, что означает, что Params [: имя] либо Нилл или не нравится тот, у меня есть в БД.

Не могли бы вы, ребята, помочь мне понять это?

Ссылка, которую я вижу, называется 'http://localhost:3000/tweets/show/.%23dadawea', что означает, что у меня есть дополнительные вещи, почему бы мне?.

+0

Вы можете сократить фактическое '#' от адреса. –

+0

Я не знаю, как использовать lookbehind, я попробовал его, как этот tag.gsub! (Tag [0], ''), но он не работает. –

+0

Для других: я изначально упоминал lookbehind , затем заметил подобный шаблон и вытер его из комментария. Затем я посмотрел документы и выяснил, что их там нет. –

ответ

1

Я хотел бы сделать следующее

def add_hashtags(tweet) 
    tweet.content.scan(/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/).flatten.each do |tag| 
    hashtag = Hashtag.where(name: tag.strip).first_or_create 
    Hashrelation.create(tweet_id: tweet.id, hashtag_id: hashtag.id) 
    end 
end 

Затем измените twitify способ выглядеть

def twitify(tweet = '') 
    tweet.gsub(/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/) do |tag| 
    " " + link_to("#{tag.strip}", hashtag_path(name: tag.strip)) 
    end.html_safe 
end 

и метод показа

def show 
    @hashtag = Hashtag.find_by_name(params[:name]) 
    @tweet_ids = Hashrelation.where(hashtag_id: @hashtag.id).pluck(:id) 
    @feed_items = Tweet.where(tweet_id: @tweets_ids) 
end 

Это должно быть то, что вы ищете , Теперь для каких изменений:

  • Удалено Дублирующая логика в add_hashtags, чтобы использовать вместо этого create.

  • twitify метод передаёт имя как параметр html, а не параметр URL, поэтому я исправил это. Прямо сейчас он думает, что вы хотите установить формат имени хэштега и назовите ссылку на имя хэштега **

  • метод show использует find_by, который будет возвращать только один результат, а не то, что вы wnat для tweet_ids поэтому я сменил его на where where и просто схватил идентификаторы. Затем изменения feed_items для поиска Tweet для всех tweet_id s в массиве.

обирать # просто использовать tag.strip[1..-1]

+0

undefined метод' strip 'для ["dupaceaspusala"]: Array, который находится в add_hashtags. Могу ли я добавить тег [ 0], который возвращает мне строку вместо массива? Или тэг [0] возвращает первый элемент строки? (Должна быть строка) –

+0

o и тег все еще имеет # в нем после регулярного выражения, поэтому, когда мы вызываем ashtag_path (name: tag.strip) Я получаю% 23, который равен # в url –

+0

# Кажется, мы можем использовать тег [0] это строка! –

Смежные вопросы