路由和搜索db ruby

时间:2014-12-23 14:01:01

标签: ruby-on-rails ruby

我想要检索所有包含特定主题标签的推文。 首先,我在我的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',这意味着我有额外的东西为什么我会这样做。

1 个答案:

答案 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]