我正在尝试替换排序的用户个人资料视图
/users/1
带
/username
我知道这意味着我需要检查各种碰撞。我咨询了以下类似的SO问题:
以下是我尝试过的各种失败的routes.rb路由定义以及相关的错误:
match "/:username" => "users#show", via: "get"
这是错误:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User without an ID
app/controllers/users_controller.rb:7:in `show'
这是我对应的users_controller:
6 def show
7 @user = User.find(params[:id])
8 end
match "/:username" => 'users#show', :as => :profile
与上述相同的错误。
match "/:username", :controller => "users/:id", :action => 'show'
Routing Error
uninitialized constant Users
Try running rake routes for more information on available routes.
match '/:username', :controller => 'users', :action => 'show'
与1相同的错误。
match '/:username', to: 'users/:id', via: 'show'
服务器无法启动。
match "/:username" => redirect("/users/:id")
错误:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with id=:id
知道为什么我的路由工作方式不同于提出这个问题的所有其他人的工作方式吗?
更新
只是将这个问题从评论中删除,并将问题更加干净地提出来。在下面的@Ryan Bigg进行更改之后,我在重定向到配置文件时遇到了路由问题。这是我的创建代码:
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
flash[:success] = "Thank you for signing up."
redirect_to ('/'+@user.username)
#redirect_to @user, notice: "Thank you for signing up!"
else
render "new"
end
end
这是我的user.rb
def to_param
self.username
#username
end
然而,我认为应该与to_param更新一起使用的注释掉的重定向不起作用,而在它上面的丑陋的hackish就行了。为什么to_param覆盖which worked for other people,不能在我的应用上运行?我的#update和#edit方法也无法正常工作,因为如果覆盖to_param不会解决这个问题,他们的重定向会转到“users / 1 / edit”而不是“username / edit”。
答案 0 :(得分:3)
第一个是正确的,但是没有用,因为你仍然试图在你的控制器中做这样的事情:
User.find(params[:username])
当你应该这样做时:
User.find_by_username!(params[:username])
第一个将尝试通过您的表的主键查找,其中第二个将正确地在用户名字段上查询。
答案 1 :(得分:0)
除了更新to_params之外,routes文件的底部还需要以下行:
resources :users, :path => '/'