質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Ruby on Rails

    7248questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Rails テーブル設計

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 834

smith

score 161

テラテイルのマイページ編集のURL[users/setting/profile]は
どのようなテーブル設計で実装されているのでしょうか
私の作ったものだとprofiles/1/editというように
idが表示されているので嫌なので同じような実装をしたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

セッションにIDを持たせているのだと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/06 01:46

    詳細教えていただけないでしょうか

    キャンセル

0

smithさんが普段お使いになっている方法はGETにてユーザーIDをURLに含めていますよね。

その他で思いつく方法としては、クッキー、セッション、最近であればHTML5の主力の一つとして取り上げられたWeb Storageなどがあるかと思います。

クッキーファイルの中身は決まった形式でデータを保持し、クライアントに保管されます。

クッキーにユーザー情報を保管しても構わないのですが、セキュリティの観点や、取扱いの煩雑さから、重要なデータを持たせるという意味では好ましくありません。

セッションというのは逆に、ユーザー情報はサーバのセッションファイルに持たせ、クッキーファイルにはセッションを開始した際にサーバが発行するセッションIDと自ホスト名等を保持する形式です。

以下のようなフローとなります。
(ログイン認証を例として)

http://localhost/users/login がログイン認証URLとします。
http://localhost/users/setting/ がユーザー情報設定のURLとます。

[クライアント]
サーバにログインページをリクエストします。その際にそのホストのクッキーファイルがあれば、クッキー情報をリクエストヘッダに追加します。

[サーバ]
クライアントのリクエストを受け付けると同時にクッキー変数をチェックします。
サーバ内にそのクッキーと共通のセッションIDをもったセッションファイルがあればそれをチェックします。
セッションファイルの中身はこのようになっています。

キー、値、有効期限、その他
キー、値、有効期限、その他
.
.
.
(その他にはドメインやパス、プロトコルやサイズなども含まれますがほとんどの場合利用に意識する必要はありません)

セッションというのはほとんどの場合、グローバル変数であり、連想配列、またはオブジェクトであることがほとんどです。
配列であれば添え字、オブジェクトであればプロパティが上記キーと考えれば分かりやすいかと思います。

例えばログイン完了時にこのサーバはuser_infoというキーで、ユーザー情報を格納したハッシュを、セッションファイルに追加するとします。

rubyは全くやったことないのですがこんな感じでしょうか?
さらにrailsのMVCにおけるパラメータ取得のルールがよくわからないので適当に読み替えてください;

# UsersコントローラのLoginアクション(でいいのでしょうか?)
#
# メールアドレスやパスワードでDBからユーザー情報を取得
# 認証に失敗した場合はログイン画面へリダイレクト
#
# 以下は成功したとして
# user_infoをハッシュとしてユーザー情報を格納後セッション変数へ追加
#
user_info = { :user_id=>1, :user_name->"hayashi", , , ,  }
session[:user_info] = user_info



# Settingコントローラクラス
#
# セッションからデータの読み出し

user_id = session[:user_info][:user_id]


上記のようにsessionというグローバル変数はrails?が用意しているもので
おそらくPHPのようにsession_startのような明示的な開始記述はいらないのかなと思われます。
これでURLのPathInfoから定数を隠ぺいしていますし、アクション毎に情報を引き継ぐ必要がなくなり、ユーザー情報そのものが、ネットワークを流れることはありません。
(しかしセッションハイジャックというクライアントのセッションIDの乗っ取りによって成り済ましを行うクラック手法もあります)

えらい長くなってしまいましたが「rails session」などで検索していただければ実際の記述は例があると思います。
Rubyの文法は全く無知なのでご容赦願います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/07 19:11

    私の質問した内容が間違っているのかもしれませんが
    頂いた回答では解決できなそうです。
    セッションを使うということは理解できましたが
    それ以外の部分については丸一日かかっても理解できませんでした。

    現在のログイン機能はgem(ライブラリ)を使って実装しており
    ユーザがアカウントを作ったタイミングで、別モデルのprofileやaddressテーブルを自動的に生成しています。
    この設計自体が間違っている気がしてきました。

    キャンセル

  • 2015/03/07 21:38

    別モデルのテーブルというのはEntityモデルのことでしょうか?
    ただ質問の内容がURLに関したものでしたので、初めの回答が理解していただけるかなとも思ったのですが、違うとなるとこちらの勘違いだったようです。
    あとURLによるリクエストパラメータとテーブル設計はほぼほぼ関係がないと思いますので一度忘れたほうがいいかもしれません。
    なかなかいい例題が出てこないのですが、URLに関してはリライトの設定でしょうし、リテラルを隠しているのはセッションでないかなと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    7248questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。