ひさびさ連載: Ruby on Rails on MacOSXでWebアプリ開発〜第三回 ログイン管理とViewの編集〜

お久しぶりです。連載第二回を書いてから、2週間も経ってしまいました。
さて、前回はDBを作って、generate scaffoldでUserのModel/View/Controllerを作るところまで行きましたね。
今回はもっとSNSの機能を作り込んでいきましょう。じゃあさっそくターミナルとeclipseとLocomotiveを立上げて、ターミナルはPROJECT_ROOTに移動してください。

まずは前回は作らなかったFriendとInvitationを作ってしまいましょう。ここでも手軽なのでscaffoldで作ります。

./script/generate scaffold friend
./script/generate scaffold invitation

http://localhost:ポート番号/friends/
http://localhost:ポート番号/invitations/

でそれぞれができていることを確認して下さい。

それでは、SNSを作っていきましょう!!

ログイン管理機能

ログイン管理機能は、LoginGeneratorというものがあるのでそれを使いましょう。 参考)Nowhere Near - Login Generator (1) まずはLoginGeneratorのインストール。インストールはターミナルから
gem install login_generator
でOK。 これで
./script generate login login_system

※login_systemのところはお好きな名前を。


とすれば、simple_SNSプロジェクトでLoginGeneratorが使えます。さっそくログイン機能を付けましょう♪
ここでeclipseを開いて、
simple_SNS/app/controllers/application.rb

を開いて下さい。
class ApplicationController < ActionController::Base

end


と書いてあると思いますので、ここを
require_dependency "login_system"

class ApplicationController < ActionController::Base
include LoginSystem
model :user
end


に書き換えてください。
次に
app/controllers/users_controller.rb

の最初に
class UsersController < ApplicationController

def index
list
render :action => 'list'
end


とあるので、
class UsersController < ApplicationController

before_filter :login_required

def index
list
render :action => 'list'
end


に書き換えて下さい。
friends_controller.rb、invitations_controller.rbも同様に
before_filter :login_required

と書き加えることで、ログインしないとアクセスできないようになります。
実際に
http://localhost:ポート番号/users/

にアクセスしてみてください。
http://localhost:ポート番号/login_system/login

にリダイレクトされて、ログインが要求されるはずです。
まだユーザ作ってないのでログインもできないですよね?でも大丈夫。LoginGeneratorはサインアップの機能も用意してくれています。DBの設計上、createtime(ユーザ登録日時)が必須項目となっていますので(そのカラムも消しとけばよかった...後悔...)、まずは
app/controllers/login_system_controller.rb

を開いて、真ん中くらいに
def signup
@user = User.new(@params[:user])

if @request.post? and @user.save
@session[:user] = User.authenticate(@user.login, @params[:user][:password])
flash['notice'] = "Signup successful"
redirect_back_or_default :action => "welcome"
end
end


とあるので、このsignupメソッドを
def signup
@user = User.new(@params[:user])
@user.createtime = Time.now

if @request.post? and @user.save
@session[:user] = User.authenticate(@user.login, @params[:user][:password])
flash['notice'] = "Signup successful"
redirect_back_or_default :action => "welcome"
end
end


に変更して下さい。あとは
http://localhost:ポート番号/login_system/signup

にアクセスして、ユーザ登録を済ませましょう。
これでログイン管理機能はできあがり〜♪ユーザ情報が表示されましたね?パスワードは暗号化されていて、変な文字列になっています。ログイン機能にはいろいろな要求があろうかと思いますが、細かい修正はsimple_SNSができ上がってからしていきましょう。

Viewの編集

さて、ここまででModelとControllerはおおまかにはでき上がって、あとはページ遷移や多少のメソッドの追加・編集が必要なだけになりました。でもRailsのscaffoldで作られるViewって味気ないですよね...ということで、次はView(見た目)を整えましょう。 Viewを変えるには、いくつかの方法があります。ここでは細かいデザインの編集はみなさんにお任せしますが、どこで何を編集すれば良いかだけまとめておきます。

1. CSSの編集

Railsのscaffoldで作られたすべてのページは
public/stylesheets/scaffold.css
を読み込みます。ですのでCSSを編集する場合は、
public/stylesheets/
以下に新たにスタイルシートを作成するか、scaffold.cssを上書きするかの2つの方法があります。

2. アプリケーション共通テンプレートの作成 or 各コントローラの全てのアクションで共通のテンプレート

デフォルトではapp/views/layout/以下に
users.rhtml
friends.rhtml
invitations.rhtml
scaffold.rhtml
という、各コントローラごとの全てのアクションで共通のテンプレートが存在します。これを編集するのが一つの方法です。 アプリケーション全体でテンプレートを共有したい場合は、app/views/layout/以下にあるすべてのファイルを消去して、
application.rhtml
という名前のテンプレートファイルを作成すればOKです。ただし個別のHTMLを挿入したい部分に
<p style="color: green"><%= flash[:notice] %></p> <%= @content_for_layout %>
と記述しておくのをお忘れなく。

3. 個別アクションテンプレートの編集

app/views/モデル名/アクション名
がそれぞれのアクションテンプレートです。 (例)app/views/users/list.rhtml => http://localhost:ポート番号/uses/list 用テンプレート 個別のアクションのテンプレートを変更したい場合はこれらを編集すればOKです。

3. モデル作成フォームテンプレートの編集

app/views/モデル名/_form.rhtml
に各モデル作成・編集時に読み込まれるフォームテンプレートがあります。 Invitationsのsenderなど、本来フォームから入力すべきでない項目は、ここの該当部分を消去すればフォームから入力できなくなります。

さて、長くなってきましたので今日はこれくらいに。
しかし、デザインは大変ですよね〜。でもこればっかりはRailsも作ってくれないんですよね。
次回はページ遷移やメソッドの追加をしていって、SNSらしさを出していきたいと思います。

ご意見、ご感想おまちしておりますm(_ _)m

連載一覧
4 trackbacks in legacy system
2006年02月20日 まじで連載!?: Ruby on Rails on MacOSXでWebアプリ開発〜第二回 DB設計 & アプリケーション自動生成〜 - Road to me ...

さて、まずは連載第一回のエントリーにコメント頂きありがとうございます。連載第一回ではeclipseにRailsプロジェクトを作成し、Locomotiveに...

2006年02月20日 もしかしたら連載: Ruby on Rails on MacOSXでWebアプリ開発〜第一回 環境構築〜 - Road to me ...

最近Ruby on RailsでWebアプリを作っているのですが、このBlogでもRailsでのアプリケーション開発について連載していこうと考えています。...

2006年02月20日 ひさびさ連載: Ruby on Rails on MacOSXでWebアプリ開発〜第三回 ログイン管理とViewの編集〜 - Road to me ...

お久しぶりです。連載第二回を書いてから、2週間も経ってしまいました。 さて、前回はDBを作って、generate scaffoldでUserのModel/...

2006年02月25日 まだまだ連載: Ruby on Rails on MacOSXでWebアプリ開発〜第四回 サイト全体のデザインを統一する〜 - Road to me ...

さて、前回の連載ではデザインについてあまり触れませんでしたが、よくよく考えるとそ...