人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

railsでユーザー管理を実装したいのですが、

Aというユーザーがログインして、以下の3つから1つをに選択するとします。
・りんご
・みかん
・いちご

そして再ログイン後、選択したものが表示されます。
Bというユーザーのログイン後の画面にはBユーザーが選択したものが表示されているというようにしたいのです。

この場合、それぞれのログインしているユーザーが選んだ情報をテーブルに保存するということになると思うのですが、ログインしているユーザーというのはどうやって渡せばいいんでしょうか?

作っているのは携帯サイトでcookieは使えません。
ユーザーIDをパラメータは渡すのも危険だと思うのですが、どういう実装方法が適切なのでしょうか。

●質問者: nagiwind
●カテゴリ:インターネット ウェブ制作
✍キーワード:cookie Rails いちご みかん りんご
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● moro
●35ポイント

とりあえず二つの問題があると理解しました。

1. cookieが使えない状況でセッションを引き回す方法

携帯でCookieが使えないとなると、セッションを引き回すためにセッションID(かさらにそれを識別するための記号)をURLに含めるやり方が多いようです。

で、それを実装するためのプラグインがjp-mobileです。

http://jpmobile.rubyforge.org/

他にも携帯ならではの事情(キャリア判別や絵文字など)のサポートもなされている、おすすめプラグインです。

# こっちの問題が主であれば、質問の頭の方に「携帯で」というのを入れるといいかな、と思います。

2. で、ユーザ管理をどうするか

もしかするとこちらについては悩んでは居ないかもしれませんが、念のため。

ログインしているユーザのIDをセッション(cookieやURLクエリじゃなく)に入れて引き回す方法が多いです。

# で、そのセッションを引き回すのがcookieや上のjpmobileです)

ログイン認証やユーザ管理まわりはacts_as_authenticatedというプラグインが使いやすいかと思います。

http://idm.s9.xrea.com/ratio/2007/09/18/000680.html

◎質問者からの返答

ありがとうございます。

セッションIDにユーザーIDを入れて引き回すということですが、jpmobileを使うと「_sission_id」というパラメータに以下のようにセッションIDが入ります。

?_session_id=aaaaaaa

1. これにユーザーID(bbb)を混ぜるということでしょうか?

?_session_id=aaaaaaabbb

2. こうするばあいリンクはどう記述すればいいのでしょうか。

jpmobileはコントローラのapplication.rbに

class ApplicationController < ActionController::Base 
 transit_sid
end

「transit_sid」と書くだけでセッションIDは自動で渡してくれるのですが、これにユーザーID(暗号化も必要?)を付加させる方法がわかりません。

コントローラで処理されるのでlink_toで書くと二重で渡されてしまうと思います。

jpmobile側のコントローラを触らないといけなくなりそうです。

また、セッションIDに埋め込んだ場合どうやってユーザーIDを受け取るんでしょうか?セッションIDの値が変更されてしまいそうですが。


無知ですいません。


2 ● moro
●35ポイント ベストアンサー

書き方が悪かったようで申し訳ありません。

ユーザIDをセッションに入れる、というのはRails内でのsessionオブジェクトにユーザIDを入れておく、という意味でした。

流れとしては

(1) URL(やcookie)にセッションIDを入れてRailsアプリにアクセスする

(2) RailsではセッションIDをもとにsessionオブジェクトを生成/検索する

(3) Railsアプリからsessionオブジェクトを使用する。Hashのように使える。ここに入れた各パラメータはセッションをまたがって使用することができる。

というようなものになります。つまりjpmobileを使うと、携帯端末からアクセスした場合の(1)と(2)の部分を勝手にやってくれるので、あとは(3) sessionオブジェクトをいじればいい、ということになります。

具体的には

class XxxContrller < ApplicationController
 # transit_sid # ApplicationControllerでやってるならこちらに書く必要はない
 def page_1
 ...
 session[:selected_fruit_id] = fruit_model.id
 end

 def page_2
 selected_fruit = Fruit.find(session[:selected_fruit_id]
 ...
 end
end

とか。セッションIDのやりとりをアプリケーション側でケアする必要は(たぶん)ないはずです。

◎質問者からの返答

ありがとうございました。うまくいきました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ