我有一个属于用户的Project模型。用户has_many项目。我根据用户模型的gem指令设置了FriendlyID,但是在这种情况下它不起作用。
<%= link_to gravatar_for(project.user, size: 50), project.user %>
上面创建了一个包含用户(project.user)的数字ID的链接,而不是友好的URL(即http://localhost:3000/users/102而不是我想要的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
将上述链接指向友好ID但不是用户的最佳方式是什么(即http://localhost:3000/users/*random-gen-string*是我想要的而不是http://localhost:3000/users/102)?
答案 0 :(得分:1)
更新:
正如聊天室中所讨论的那样,User.find_each(&:save!)
会在保存User
模型时显示错误。在上述情况下,缺少密码输入阻止了User
记录的保存。临时删除验证允许保存User
,从而重新生成slu ..
(原始答案留给历史)
您可以覆盖to_param
模型中的User
方法,如下所示
class User < ApplicationRecord
# some code
def to_param
slug
end
然后用于生成链接。有关详情,请参阅the guides。
答案 1 :(得分:0)
当您构建link_to时,您可以调用user.slug以确保您获得正确的信息
<%= link_to gravatar_for(project.user, size: 50), project.user.slug %>
将生成您期望的链接http://localhost:3000/users/ random-gen-string
答案 2 :(得分:0)
以下是具有不断增加的特定顺序的城市的例子。
def slug_candidates
[
:name,
[:name, :city],
[:name, :street, :city],
[:name, :street_number, :street, :city]
]
端
如果出现冲突,最好使用用户友好的名称,然后使用UUID(例如2bc2-d3dd-4f29-b2ad)