ある種のユーザープロファイルビューを置き換えようとしています
/users/1
と
/username
これは、さまざまな種類の衝突をチェックする必要があることを意味します。次の同様のSOの質問を調べました。
- Ruby on Rails ルーティング マッチング ユーザー名
- ユーザー名でレールのURLをカスタマイズする
- ユーザー名を URL にする Rails でのルーティング:
- URL の :username によるルーティング エラー
これは、私が試したさまざまな失敗した routes.rb ルート定義と、関連するエラーです。
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
match "/:username" => 'users#show', :as => :profile
上記と同じエラー。
match "/:username", :controller => "users/:id", :action => 'show'
Routing Error uninitialized constant Users Try running rake routes for more information on available routes.
match '/:username', :controller => 'users', :action => 'show'
1と同じエラー。
match '/:username', to: 'users/:id', via: 'show'
サーバーが起動しません。
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 メソッドも機能しません。