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


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

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

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

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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2007/09/24 17:41:48
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:moro No.2

回答回数23ベストアンサー獲得回数10

ポイント35pt

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

ユーザ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のやりとりをアプリケーション側でケアする必要は(たぶん)ないはずです。

id:nagiwind

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

2007/09/24 17:41:08

その他の回答1件)

id:moro No.1

回答回数23ベストアンサー獲得回数10

ポイント35pt

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

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:nagiwind

ありがとうございます。

セッション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の値が変更されてしまいそうですが。


無知ですいません。

2007/09/24 04:20:54
id:moro No.2

回答回数23ベストアンサー獲得回数10ここでベストアンサー

ポイント35pt

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

ユーザ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のやりとりをアプリケーション側でケアする必要は(たぶん)ないはずです。

id:nagiwind

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

2007/09/24 17:41:08

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません