RailsアプリケーションでOmniAuth-identityを実行し、ユーザーを「ユーザー」モデルで保存しました。ユーザーにアクセスするには、次を指す必要があります。
0.0.0.0:3000/users/:id
しかし、facebook や twitter のように、ユーザーの一意の名前を入力するだけでそこに到達したかったのです。
0.0.0.0:3000/username
そこで、グローブ ルートを作成しました。
match "/*id" => "users#show"
渡されたパラメーターに応じて、ID ではなく名前で検索するようにユーザーコントローラーの show メソッドを変更しました。
def show
if params[:id].is_a?(String)
@user = User.find_by_name(params[:id])
else
@user = User.find(params[:id])
end
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
end
ルーティングが機能します。
0.0.0.0:3000/username
ユーザー情報が正常に表示されます。しかし、ログアウトしたり、古いルートのようにユーザーを見つけたりすることはできません.. (コントローラーに追加した条件で String||Int.
これを行うと、次のようになります。
NoMethodError in Users#show
Showing /home/juanchi/Dropbox/GitHub/RSandBox/app/views/users/show.html.erb where line #5 raised:
undefined method `provider' for nil:NilClass
Extracted source (around line #5):
2:
3: <p>
4: <b>Provider:</b>
5: <%= @user.provider %>
6: </p>
7:
8: <p>
Rails.root: /home/juanchi/Dropbox/GitHub/RSandBox
Application Trace | Framework Trace | Full Trace
app/views/users/show.html.erb:5:in `_app_views_users_show_html_erb___448583227_80374500'
app/controllers/users_controller.rb:22:in `show'
Request
Parameters:
{"id"=>"logout"}
Show session dump
Show env dump
Response
Headers:
None
ユーザー コントローラーの show メソッドでの情報の取得に失敗します。しかし、新しいルートを使用するとうまくいきます...では、何が欠けているのでしょうか?
新しいルーティング ルールと古いルーティング ルールを同時にサポートするにはどうすればよいですか?
そして、そのルートはユーザーのログアウト方法とどのような関係があるのでしょうか?
ログアウトすると、sessions#detroy メソッドが呼び出されます。
def destroy
session[:user_id] = nil
redirect_to root_url, :notice => "Goodbye!"
end