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

Posted

技术标签:

【中文标题】rails,friendly_id,设计用户名不显示 slug【英文标题】:rails, friendly_id, devise username not showing slug 【发布时间】:2015-01-17 21:25:18 【问题描述】:

我觉得我遗漏了一些明显的东西,但希望有人能尽快帮助我。

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

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

在我的用户控制器中:

class UsersController < ApplicationController

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

end

当我在浏览器中加载 show 方法时,它仍然有 localhost:3000/user/3 - 它没有显示 slug。我知道我一切正常,因为我的 Post Model 中有相同的代码并且它运行良好。用户验证/设计是否有我遗漏的东西导致它无法工作?

任何帮助表示赞赏,谢谢!

【问题讨论】:

【参考方案1】:

原因是 slug 没有保存。我认为您正在尝试查找在初始化友好 ID 之前保存的旧记录。但是,尽管您可以生成 slug 并为您的记录生成友好 ID。这是过程。

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

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

User.find_each(&:save!)

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

<%= link_to "USER", current_user %>

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

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

【讨论】:

嗨 Rubyrider - 感谢您的回复!我尝试了你的建议,但它仍然没有在 URL 中显示 slug。事实上,我在 User 表中取了很多,并且填充了 slug 列,所以它肯定是节省的。事实上,如果我在 URL 中输入 slug,它就可以工作。 (例如 localhost:3000/user/bobsmith) - 只有当我从页面单击链接时,它仍会显示 ID。有什么建议吗? 哦,我明白了。那么你如何定义你的网址呢?能给我举个例子吗?所以我可以帮忙吗?我想我理解你的问题。 好的,谢谢! - 在我的显示方法视图中,我的主要用户链接之一是: - 此链接将转到 localhost:3000/user/3 朋友说错了 :) 让我在我的回答中说明好吗? 现在只需检查我的答案 :) 您直接调用 id 属性,它只会给您 id 值。但是rails通过在对象上调用to_param来生成url来生成id。所以我想现在一切都应该工作了!编码愉快!

以上是关于rails,friendly_id,设计用户名不显示 slug的主要内容,如果未能解决你的问题,请参考以下文章

Rails:friendly_id 和 to_json

导轨/Friendly_id。如何为旧的(丑陋的)URL 呈现 404 页面

Rails:Friendly_id 不会为旧记录生成 slug

Rails gem“friendly_id”:如何在创建对象之前获得 slug 的实时预览

Rails Friendly_id:Slug 未正确生成

rails 使用 friendly_id gem 按资源名称路由访问