2

我已经建立了一个类似于 Twitter 的@replies,它允许用户通过用户每日帖子相互联系......类似于 stackoverflow 的。

以此为指导https://github.com/kltcalamay/sample_app/compare/original-version...master

如何解析/扫描帖子,然后将@usernames 替换为指向该用户页面的链接

帖子示例。

Kevins Post:
 @Pzpcreations @john @steve hey everyone lets all hang out today

我想扫描/解析帖子,然后将用户@Pzpcreations @john @steve 链接到他们的个人资料

我尝试在我的 Dailypost 模型中创建一个方法,将用户名存储在一个数组中......但是 IDK 如何替换并将它们链接到相应的用户页面

def username_link
  str = self.content_html
  recipient = str.scan(USERNAME_REGEX)
end

这给了我 ["@Pzpcreaations", "@john", "@steve"]

请帮帮我.... Rails 新手 :)

楷模

class Recipient < ActiveRecord::Base
  attr_accessible :dailypost_id, :user_id

  belongs_to :user
  belongs_to :dailypost

end

class User < ActiveRecord::Base
  attr_accessible :name, :email, username

  has_many :dailyposts, dependent: :destroy

  has_many :replies, :class_name => 'Recipient', :dependent => :destroy
  has_many :received_replies, :through => :replies, :source => 'dailypost'

end

class Dailypost < ActiveRecord::Base  
  attr_accessible :content, :recipients
  belongs_to :user

  ###What is the Correct REGEX for Rails 4?
  USERNAME_REGEX = /@\w+/i

  has_many :recipients, dependent: :destroy
  has_many :replied_users, :through => :recipients, :source => "user"

  after_save :save_recipients

  **private**

    def save_recipients
      return unless reply?

      people_replied.each do |user|
        Recipient.create!(:dailypost_id => self.id, :user_id => user.id)
      end
    end

    def reply?
      self.content.match( USERNAME_REGEX )
    end

    def people_replied
      users = []
      self.content.clone.gsub!( USERNAME_REGEX ).each do |username|
        user = User.find_by_username(username[1..-1])
        users << user if user
      end
      users.uniq
    end
end

架构

create_table "recipients", :force => true do |t|
  t.string   "user_id"
  t.string   "dailypost_id"
  t.datetime "created_at",   :null => false
  t.datetime "updated_at",   :null => false
end

[#<Recipient id: 7, **user_id: "103"**, dailypost_id: "316", created_at: "2013-06-18 
10:31:16", updated_at: "2013-06-18 10:31:16">]

User_ID in recipients are the users that are mentioned in the Dailypost.

意见

<%= link_to dailypost.username_link %>
4

2 回答 2

2

您可以将每个匹配项传递给一个块。在此块中,您返回所需的链接,例如

def username_link
  str = self.content_html
  str.gsub!(USERNAME_REGEX).each do |recipient|
    if User.find_by_name(recipient) 
      "[link to #{recipient}]"
     else 
       recipient
     end
  end
end

编辑

在中创建一个辅助函数app/helpers/posts_helper.rb

def post_with_links(post)
  post.content_html.gsub(/@\w+/).each do |username|
    user = User.find_by_username(username[1..-1])
    if user
      link_to username, user
    else
      username
    end
end

在您的视图中使用它

<%= post_with_links(post) %>
于 2013-06-20T20:17:26.197 回答
1

您希望对每个用户名进行查找和替换,并生成指向用户个人资料的链接。它看起来像这样:

def username_link
  new_content_html = self.content_html  
  recipients = new_content_html.scan(USERNAME_REGEX)

  recipients.each do |recipient|
    user = User.find_by_username(recipient) # strip off the @ if required
    new_content_html.gsub!(recipient, "<a href='#{users_path(user)}'>#{user.username}</a>")
  end

  new_content_html
end

这假设您在users生成该users_path方法的路由文件中有一个路由。

有很多额外的事情要讨论,因为它涉及到类似 twitter 的回复系统,并且自己发现这些内容将是乐趣的一半!;)

于 2013-06-20T20:07:26.683 回答