3

我正在尝试替换此类用户个人资料视图

/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 更新一起使用)不起作用,而上面那个丑陋的 hackish 则不起作用。为什么对其他人有效的 to_param 覆盖我的应用程序上无效?我的 #update 和 #edit 方法也不起作用,因为如果覆盖 to_param 不能解决这个问题,它们的重定向会转到“users/1/edit”而不是“username/edit”。

4

2 回答 2

3

第一个是正确的,但由于您仍在尝试在控制器中执行类似操作,因此无法正常工作:

User.find(params[:username])

当你应该这样做时:

User.find_by_username!(params[:username])

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

于 2012-07-17T01:43:56.153 回答
0

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

resources :users, :path => '/'

于 2012-07-21T21:27:01.153 回答