Rails中正确的路由短网址的用户名(Correct routing for short url b

2019-07-30 10:51发布

我试图取代的那种用户配置文件的意见

/users/1

/username

我知道这意味着我需要检查的各种冲突。 我请教以下类似的SO问题:

  • Ruby on Rails的路由匹配用户名
  • 定制导轨和用户名网址
  • 路由Rails中使用户名的网址:
  • 路由错误有:url中的用户名

这里有各种失败的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比格变化后,我在重定向有一个路由问题创建一个新的时剖析。 这里是我创建的代码:

  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覆盖, 这工作了其他人 ,不工作我的应用程序? 我#UPDATE和#edit方法也没有工作,因为他们的重定向到“用户/ 1 /编辑”而不是“用户名/编辑”如果覆盖to_param不照顾这。

Answer 1:

第一个是正确的,但不能正常工作,因为你还在试图做这样的事情您的控制器内:

User.find(params[:username])

当你应该改为这样:

User.find_by_username!(params[:username])

第一个将尝试通过你的表,其中第二个会,正确,对用户名字段查询,而不是主键查找。



Answer 2:

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

resources :users, :path => '/'



文章来源: Correct routing for short url by username in Rails