Ruby on rails 3 在Rails中按用户名正确路由短url

Ruby on rails 3 在Rails中按用户名正确路由短url,ruby-on-rails-3,rails-routing,Ruby On Rails 3,Rails Routing,我正在尝试替换类似的用户配置文件视图 /users/1 与 /username 我知道这意味着我需要检查各种碰撞。我咨询了以下类似的SO问题: 以下是我尝试过的各种失败routes.rb路由定义以及相关错误: 匹配”/:username“=>“用户#显示”,通过:“获取” 以下是错误: ActiveRecord::RecordNotFound in UsersController#show Couldn't find User without an ID app/controll

我正在尝试替换类似的用户配置文件视图

/users/1

/username

我知道这意味着我需要检查各种碰撞。我咨询了以下类似的SO问题:

以下是我尝试过的各种失败routes.rb路由定义以及相关错误:

  • 匹配”/:username“=>“用户#显示”,通过:“获取”

    以下是错误:

    ActiveRecord::RecordNotFound in UsersController#show
    
    Couldn't find User without an ID
    
    app/controllers/users_controller.rb:7:in `show'
    
    这是我对应的用户\u控制器:

    6 def show
    7   @user = User.find(params[:id])
    8 end
    
    User.find(params[:username])
    
  • match”/:username“=>“用户#显示”,: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'

     Routing Error
    
     uninitialized constant Users
    
     Try running rake routes for more information on available routes.
    
    与1相同的错误

  • 通过“show”将“/:username”匹配到“users/:id”

     Routing Error
    
     uninitialized constant Users
    
     Try running rake routes for more information on available routes.
    
    服务器未启动

  • 匹配”/:username=>重定向(“/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_参数会被覆盖,而不是在我的应用程序上工作?我的#update和#edit方法也不起作用,因为如果覆盖到#param,它们的重定向将转到“users/1/edit”而不是“username/edit”。第一个方法是正确的,但不起作用,因为您仍在尝试在控制器内执行类似操作:

    6 def show
    7   @user = User.find(params[:id])
    8 end
    
    User.find(params[:username])
    
    当您应该这样做时:

    User.find_by_username!(params[:username])
    

    第一个将尝试通过表的主键查找,第二个将正确地改为查询用户名字段。

    除了更新to_参数外,routes文件的底部还需要以下行:


    resources:users,:path=>'/'

    我明白了。你能解释一下当前控制器的风格有什么问题吗?我应该如何正确地思考另一个问题?Ryan,你已经非常彻底地回答了我的问题,但是我可以问一下如何命名重定向路线吗?我正在尝试这个方法,但它不起作用,在我的create user方法下:
    @user=user.new(params[:user]),如果@user.save redirect\u指向@user.username
    无需担心---对于其他人来说,我用“redirect\u指向”/@user.username`@Mittenchops解决了这个问题:这太难看了。我要做的是重写用户模型上的参数,只返回
    username
    ,然后将
    重定向到@user
    将重定向到正确的路径。我已经更新了,以跟随您的评论-您能告诉我为什么这不起作用吗<代码>重定向到@user尝试重定向到nil。