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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

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

Q&A

2回答

1884閲覧

Rails テーブル設計

smith

総合スコア73

Ruby on Rails

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

0グッド

1クリップ

投稿2015/03/02 07:56

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2015/03/02 15:16

hayashi_kohei

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smith

2015/03/05 16:46

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

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におけるパラメータ取得のルールがよくわからないので適当に読み替えてください;

lang

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

lang

1# Settingコントローラクラス 2# 3# セッションからデータの読み出し 4 5user_id = session[:user_info][:user_id] 6

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

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

投稿2015/03/05 19:33

編集2015/03/05 19:41
hayashi_kohei

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smith

2015/03/07 10:11

私の質問した内容が間違っているのかもしれませんが 頂いた回答では解決できなそうです。 セッションを使うということは理解できましたが それ以外の部分については丸一日かかっても理解できませんでした。 現在のログイン機能はgem(ライブラリ)を使って実装しており ユーザがアカウントを作ったタイミングで、別モデルのprofileやaddressテーブルを自動的に生成しています。 この設計自体が間違っている気がしてきました。
hayashi_kohei

2015/03/07 12:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問