LoginSignup
3
2

More than 5 years have passed since last update.

Railsでルートパス/ユーザ名のルートを作成した時に起こったこととその対策 (Railsチュートリアル改造)

Last updated at Posted at 2018-06-17

Rialsチュートリアルに従って、アプリを作っていくと、User Modelの作成、User ControllerでCRUDができます。

このUser Modelを使用して、自分のサービスを作ってみようと思っている人も多いのではないでしょうか。ぼくもその口でした。

目標は簡易的なユーザーごとのホームページサービスを作ること。
しかし、チュートリアル通りのルーティングでユーザーページを表示しようと思うと、

/users/(:id)

となるためちょっとダサい。
そこでルーティングを

/(:username)

と、できるように改造しました。その方法と不具合をまとめました。

1. どうやったのか

参考にしたのは、下記のリンク
http://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/
この3番目を参考にして、routes.rbは

ruby: routes.rb
Rails.application.routes.draw do
resources :users, param: :username, path: '/', only: [:show, :edit, :update, :destroy]
end

となりました。

User tableのカラムは name -> usernameに変更しました。

2. User Controllerの修正

チュートリアルではparams[:id]をURLから受け取っていました。

user_controller.rb
  def edit
    @user = User.find(params[:id])
  end

しかし、1. でみた通り、param: :username とparamsの定義を変更しているので、:usernameで検索する必要があります。

user_controller.rb
  def edit
    @user = User.find_by(username: params[:username])
  end

他のメソッド(update, deleate)でも同様に、params[:username]に変更する必要があります。Privateで定義しているメソッドも忘れないように更新しましょう。

user_controller.rb
  def correct_user
    @user = User.find_by(username: params[:username])
    redirect_to(root_url) unless current_user?(@user)
  end

3. Viewで貼っているリンクの変更

ユーザーのページへのリンクはcurrent_userメソッドで受け取ったidとしていましたが、usernameに変更したので、

<%= link_to "Profile", current_user, class: "nav-link" %>

<%= link_to "Profile", user_path(current_user.username), class: "nav-link" %>

に変更する必要があります。

4. Picture Uploaderの不具合?

なぜか不具合が起きましたが、Rails serverを再起動したら直りました。結構はまってしまって、次の日起きたらできるようになっていたので、コンチクショーとなりました。

5. まとめ

デフォルトから変更するのは思いもよらない不具合が多かったですが、その分勉強になりました。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2