代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

在Rails中按用户名正确路由短url

  •  3
  • Mittenchops  · 技术社区  · 12 年前

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

    /users/1

    具有

    /username

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

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

    1. 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
      
    2. match "/:username" => 'users#show', :as => :profile

      与上述错误相同。

    3. match "/:username", :controller => "users/:id", :action => 'show'

       Routing Error
      
       uninitialized constant Users
      
       Try running rake routes for more information on available routes.
      
    4. match '/:username', :controller => 'users', :action => 'show'

      与1相同的错误。

    5. match '/:username', to: 'users/:id', via: 'show'

      服务器未启动。

    6. 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更新一起使用的注释掉的重定向不起作用,而上面丑陋的黑客重定向起作用。为什么to_param被覆盖, which worked for other people ,不在我的应用程序上工作?我的#update和#edit方法也不起作用,因为如果覆盖到_param无法解决这一问题,它们的重定向将转到“users/1/edit”而不是“username/edit”。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ryan Bigg Andrés Bonilla    12 年前

    第一个是正确的,但不起作用,因为您仍在尝试在控制器内执行以下操作:

    User.find(params[:username])
    

    当你应该这样做的时候:

    User.find_by_username!(params[:username])
    

    第一个将尝试通过表的主键进行查找,而第二个将正确地查询username字段。

        2
  •  0
  •   Mittenchops    12 年前

    除了更新to_params之外,路由文件的底部还需要以下行:

    resources :users, :path => '/'