【问题标题】:Rails routes /name instead of /users/:idRails 路由 /name 而不是 /users/:id
【发布时间】:2016-10-19 10:17:14
【问题描述】:

我已经完成了 Hartl 的教程,并正在尝试以与 twitter 相同的方式为我的 twitter 克隆创建虚 URL,例如www.twitter.com/realDonaldTrump

我已经设法让我的网址看起来像 /users/:slug。 想知道 - 我如何得到它,所以它只是 /:slug?

这是我到目前为止所做的:

1.在我的用户模型中,没有“用户名”列,所以我改用“名称”。

2.生成新的迁移以将 slug 列添加到用户模型数据库。

3.插入 Rails 控制台,通过键入以下内容为所有用户添加 slug:

User.all.each do |user|
  user.slug = user.name.downcase.parameterize
  user.save
end

4.Configured UsersController 显示动作到:

def show
  @user = User.find_by_slug(params[:id])
  @microposts = @user.microposts.paginate(page: params[:page])
  redirect_to root_url and return unless @user.activated?
end

现在我已经对其进行了配置,使其显示 /users/:slug,我该如何更改它使其只是 /:slug?

【问题讨论】:

  • 把路由改成get '/:id', to: 'users#show'
  • 这似乎可行,例如,我可以访问个人资料页面 /chloe-schamberger。但现在我无法访问我的任何其他页面。我得到一个错误: undefined method `microposts' for nil:NilClass def show @user = User.find_by_slug(params[:id]) @microposts = @user.microposts.paginate(page: params[:page]) redirect_to root_url 和除非@user.activated 否则返回?结束
  • 似乎每当我访问集合页面时,例如 /users、/help、/about,路由都认为 :id = users。我该如何解决这个问题?
  • 最后放get '/:slug', to: 'users#show'这条路线。

标签: ruby-on-rails


【解决方案1】:

试试这个......

编辑 app/models/user.rb

class User < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged
end

User.create! name: "Username"

在控制器中将 User.find 更改为 User.friendly.find

User.friendly.find(params[:id])

rails server

http://localhost:3000/users/username

如果您将 FriendlyId 添加到现有应用并需要 要为现有用户生成 slug,请从 控制台、运行器或添加 Rake 任务:

User.find_each(&:save)

要获取 /username 而不是 /users/username 试试这个...

在你的用户模型中添加

class User < ActiveRecord::Base
  ...
  def to_param
    name
  end
  ...
end

但请确保在您的控制器中按用户名查找用户。

在你的控制器中添加

class UsersController < ApplicationController
  ...
  def show
    @user = User.find_by(name: params[:id])
  end
end

至于将您的用户路由到 /username,您有多种选择:

get ':id', to: 'users#show', as: 'show'
resources 'users', path: '/'

只需确保将这些路线放在路线文件的末尾即可。

希望这对你有用。

【讨论】:

  • 这需要友好的 ID 宝石对吗?另外,我正在尝试获取 /username 而不是 /users/username
  • @JosephLiu :是的,这需要gem 'friendly_id'
  • @JosephLiu :我已经更新了我的答案,请看一下。谢谢!
  • 如果我安装了friendly_id,我应该更新到_params 吗?我以为friendly_id 已经这样做了
【解决方案2】:

更改你的根目录

get '/:slug', to: 'users#show'

在您的用户控制器上

def show
  @user = User.find_by slug: params[:slug]
...
end

别忘了去掉':show' before_action :set_user,仅:[:show, :edit, :update] 您的控制器作为“set_user”使用 :id 而不是 :slug 来检索实例

请注意,保存时您必须担心模型中的 slug 唯一性

before_validation :set_slug    
validates :slug, uniqueness: true

private

def set_slug
...
end

【讨论】:

    【解决方案3】:

    get '/:slug', to: 'users#show' 将此作为最后一条路线并检查。

    既然是我们创建的命名路线,就应该放在最后,以免干扰其他路线。

    在你的Users Controller

    def show
      @user = User.find_by slug: params[:slug]
    end
    

    【讨论】:

    • 似乎不适用于 get '/:slug',但适用于 '/:id'。这有什么原因吗?
    • 另外,有些页面似乎无法正常工作。例如,我的关注者页面。这是因为我必须用 User.find_by_slug(params[:id]) 替换所有说 @user = User.find(params[:id]) 的地方吗?
    • 是的.. 我可以访问 /users、/about、/contact 等页面,但无法访问 users/example-user/edit、users/example-user/followers 等页面
    • get '/:id/edit', to: 'users#edit' 尝试改变编辑路线,终于
    • 不走运。说“找不到具有 'id'=example-user' 的用户,并突出显示此行:`@user = User.find(params[:id])`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2014-06-02
    • 2021-08-31
    • 2013-10-11
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多