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 の更新で動作すると思われるコメントアウトされたリダイレクトは動作しませんが、その上の醜いハックのようなものは動作します。他の人では機能していた to_param の上書きが、私のアプリでは機能しないのはなぜですか? to_param を上書きしてもこれが処理されない場合、リダイレクトは「username/edit」ではなく「users/1/edit」に移動するため、#update および #edit メソッドも機能しません。

4

2 に答える 2

3

最初のものは正しいですが、コントローラー内で次のようなことを実行しようとしているため、機能していません。

User.find(params[:username])

代わりにこれを行う必要がある場合:

User.find_by_username!(params[:username])

1つ目は、テーブルの主キーで検索を試みますが、2つ目は、代わりにユーザー名フィールドを正しくクエリします。

于 2012-07-17T01:43:56.153 に答える
0

to_params の更新に加えて、ルート ファイルの下部に次の行が必要です。

resources :users, :path => '/'

于 2012-07-21T21:27:01.153 に答える