儿童

时间:2016-12-30 12:47:26

标签: ruby-on-rails ruby-on-rails-4 friendly-id

我有一个属于用户的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.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

将上述链接指向友好ID但不是用户的最佳方式是什么(即http://localhost:3000/users/*random-gen-string*是我想要的而不是http://localhost:3000/users/102)?

3 个答案:

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