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.user
在 projects_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)
我有一个属于用户的项目模型。一个用户 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.user
在 projects_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)