child 的 FriendlyID

FriendlyID for child

我有一个属于用户的项目模型。一个用户 has_many 个项目。我已经根据用户模型的 gem 说明设置了 FriendlyID,但是在这种情况下它不起作用。

<%= link_to gravatar_for(project.user, size: 50), project.user %>

上面创建了一个带有用户数字 ID (project.user) 的 link,而不是友好的 URL(即 http://localhost:3000/users/102 instead of what I want, http://localhost:3000/users/*random-gen-string*)。

User.rb 文件:

class User < ApplicationRecord
  extend FriendlyId
  friendly_id :generated_slug, use: :slugged

  def generated_slug
    require 'securerandom'
    @random_slug ||= persisted? ? friendly_id : SecureRandom.hex(15)
  end

我认为问题在于 project.userprojects_controller.rb 中设置为用户 ID(通过 current_user.projects.build...)。如果我能以某种方式访问​​ projects_controller.rb 中用户的友好 ID,我可以将它保存在数据库中并像 project.user_friendly_id 一样访问它。不确定..

projects_controller中的相关代码:

def create
 @project = current_user.projects.build(project_params)
 # code
end

将上述 link link 发送给友好 ID 而不是用户(即 http://localhost:3000/users/*random-gen-string* is what I want instead of http://localhost:3000/users/102)的最佳方法是什么?

更新:

正如在聊天室中讨论的那样,User.find_each(&:save!) 揭示了保存 User 模型时的错误。在上述情况下,缺少密码输入导致 User 记录无法保存。暂时删除验证允许保存 User 并因此重新生成 slug。

(原答案留作历史) 您可以像这样

User 模型中覆盖 to_param 方法
class User < ApplicationRecord
  # some code

  def to_param
    slug
  end

然后就是用来生成link。 the guides.

中有更多相关信息

构建 link_to 时,您可以调用 user.slug 以确保获得正确的信息

<%= link_to gravatar_for(project.user, size: 50), project.user.slug %>

将生成您期望的 link http://localhost:3000/users/random-gen-string

这里是一个城市的例子,具体程度从高到低。

 def slug_candidates
[
  :name,
  [:name, :city],
  [:name, :street, :city],
  [:name, :street_number, :street, :city]
]

结束

如果 slug 冲突,最好使用用户友好的名称然后使用 UUID(例如 2bc2-d3dd-4f29-b2ad)