【问题标题】:Showing username in url without controller name在没有控制器名称的 url 中显示用户名
【发布时间】:2013-06-01 18:13:41
【问题描述】:

希望大家今天早上一切都好。最近一直在学习 rails,并且一直在开发一个小的“社交”应用程序来练习。我四处寻找一个好的答案,但找不到适合我的东西。这是我现在想要弄清楚的:

默认情况下,url 是 hi.com/user/12,到目前为止,我已将其更改为 /user/name。那里一切正常。但当然,我想更进一步,做 hi.com/name(主要是因为我想了解它是如何正确完成的)。

这是我的(缩写)路线:

resources :users do
  member do
    get :following, :followers
  end
end

root to: 'pages#home'

match '/help',    to: 'pages#help'
match '/about',   to: 'pages#about'
match '/contact', to: 'pages#contact'

match '/signup',  to: 'users#new'
match '/signin',  to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete

这是控制器的显示视图:

def show
  @user = User.find_by_username(params[:id])
  @tweets = @user.tweets.paginate(page: params[:page])
end

现在我尝试将match ':username', to: 'users#show' 粘贴在我的路由中,然后将控制器中的find_by_username(params[:id]) 更改为find_by_username(params[:username])。这实际上效果很好,并在 hi.com/name 上显示了所有正确的用户信息。关注者和关注者仍然(如预期)在用户/名称/关注者上(并且他们工作正常)。但是,所有静态页面都会中断,包括 /signout(有点重要:p),虽然 /users 仍然显示所有用户的索引,但 users/name 会引发错误(如果 /name 有效,那么我不需要 /users/无论如何命名)。错误是用户控制器中 nil:NilClass 的未定义方法 `tweets'

我要再次尝试完成的是 hi.com/username 和 hi.com/username/following 等。还需要我的静态页面仍然可以工作。我的一切都与 /users/name 一起工作,但我也想学习如何让它以这种方式工作。

谢谢大家,我很感激!

【问题讨论】:

  • 只是作为建议:创建问题时,请坚持基本信息。您可以省去开头段落和结尾段落。我们更喜欢为您提供良好答案所需的事实和信息。除此之外的叙述并不是真正需要的,并且可能会出现“TL;DR”响应。
  • 好的,我会记住的。我只是想提供一些背景信息,而且我是菜鸟,所以我不太确定可能/可能不需要哪些信息。谢谢!
  • 如果需要更多信息,人们会询问。

标签: ruby-on-rails ruby routes url-routing


【解决方案1】:

基本上,这很容易,但有副作用。

只需在您的 routes.rb 末尾添加:

get '/:id', to: 'user#show'

但是,名为 aboutuserspages 的用户将无法看到他们的个人资料,因为之前在您的 routes.rb 中使用了该路径。

【讨论】:

  • 为了快速轻松地修复,这很棒。据我了解,这会在 url 上查找配置文件,如果有,它会显示它。绝对有效,REST 路由仍然必须通过 /users/name/。我的后续问题是:防止人们使用静态页面名称注册的最佳方法是什么?我应该如何处理仍然有效但只是重复的 /users/name/ 路由?谢谢!
  • 1) 有一个他们无法选择的用户名黑名单。 2)在你的路由之前让那些匹配路由器。
猜你喜欢
  • 1970-01-01
  • 2014-08-16
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多