在Rails中用用户名正确路由短网址

时间:2012-07-17 01:03:00

标签: ruby-on-rails-3 rails-routing

我正在尝试替换排序的用户个人资料视图

/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
    
  7. 知道为什么我的路由工作方式不同于提出这个问题的所有其他人的工作方式吗?

    更新

    只是将这个问题从评论中删除,并将问题更加干净地提出来。在下面的@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”。

2 个答案:

答案 0 :(得分:3)

第一个是正确的,但是没有用,因为你仍然试图在你的控制器中做这样的事情:

User.find(params[:username])

当你应该这样做时:

User.find_by_username!(params[:username])

第一个将尝试通过您的表的主键查找,其中第二个将正确地在用户名字段上查询。

答案 1 :(得分:0)

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

resources :users, :path => '/'