我想要检索所有包含特定主题标签的推文。 首先,我在我的2个表中添加了主题标签:
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
然后我想路由到推文控制器的show方法:
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
最后,推文控制器的show方法是:
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 [:name]要么是nill,要么与我在DB中的那个不一样。
你们可以帮我解决这个问题吗?
我看到的链接是'http://localhost:3000/tweets/show/.%23dadawea'
,这意味着我有额外的东西为什么我会这样做。
答案 0 :(得分: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
和show方法
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,它只会返回一个结果,而不会返回tweet_ids
的结果,所以我将其更改为where子句并抓住了id。然后更改feed_items
以搜索Tweet
以查找数组中的所有tweet_id
。
要剥离#
,只需使用tag.strip[1..-1]