rails,friendly_id,设计用户名不显示slug

时间:2014-11-20 05:33:44

标签: ruby-on-rails model devise slug friendly-id

我觉得我错过了一些明显的东西,但希望有人可以帮我快点。

我正在尝试为我的用户模型创建一个friendly_id slug(使用Devise)。这是我的模特:

class User < ActiveRecord::Base

  extend FriendlyId
  friendly_id :username, use: [:slugged, :finders]

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  validates :username, :uniqueness => {:case_sensitive => false},
  :format => { with: /\A[a-zA-Z0-9]+\Z/ }

end

在我的UserController中:

class UsersController < ApplicationController

def show
    @user = User.find(params[:id])
end

end

当我在浏览器中加载show方法时,它仍然具有localhost:3000 / user / 3 - 它不会显示slug。我知道我已经完成了所有工作,因为我在Post模型中使用了相同的代码并且它完美运行。用户验证/设计中是否存在一些导致其无法正常工作的内容?

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:4)

原因是slug没有保存。我想您正在尝试查找在初始化friendly_id之前保存的旧记录。但是,虽然您可以生成slug并为您的记录生成friendly-id。这是过程。

def should_generate_new_friendly_id?
   new_record? || slug.nil? || slug.blank? # you can add more condition here
end

添加此方法后,只需尝试再次保存所有记录。友好将调用该方法,如果条件匹配您在该块内定义的条件,将更新slug。

User.find_each(&:save!)

在您的视图文件中写下网址:

<%= link_to "USER", current_user %>

<%= link_to "USER", user_path(current_user.to_param) %>

另请确保您没有空白的用户名。如果用户名可能为空,则可以使用动态方法,您可以有条件地设置列以用于生成slug。我想应该就是全部! 谢谢!