今日のテーマは悲しいメッセージに触発されています 。 ですから、私の仕事は、Ruby on Railsで承認を行うことがいかに簡単かを示すことです。 初心者のタスクは、読んで試すことであり、初心者ではないタスクは、より良い方法やエラーを指摘する方法を読み書きすることです。
使用ツール:
- Ruby 1.8.6
- Mac OS X 10.5.6
- Rails 2.2.2
- 雑種1.1.5
- MySQL 5.0.51b
標準操作:
rails auth -d [ ]
cd auth
rm public/index.html
[ config/database.yml]
rake db:create
RoRには承認用のプラグインがたくさんあります。 restful-authenticationを使用します。
インストールはかなり標準的です:
script/plugin install git://github.com/technoweenie/restful-authentication.git
次に、ログインパスワードとその他のユーザー関連データを保存するユーザーモデルを作成する必要があります。 また、2つのコントローラーが必要です。 1つは登録用で、もう1つはログイン/ログアウト用です。 ユーザーモデルをユーザー、ログインログアウトセッションのコントローラーとし、次のコマンドを実行します。
script/generate authenticated user sessions
プラグインはすべてを行います。 このジェネレーターにはいくつかのオプションがあります。たとえば、電子メールによるユーザーのアクティベーションを追加する--include-activationです。 詳細については、ドキュメントを参照することをお勧めします。
ジェネレーターは、2人のユーザーとセッションコントローラー、ユーザーモデル、ユーザーモデルの移行、config / routes.rbのエントリ、およびすぐに自分のものに置き換える可能性が高いそれらのいくつかを作成します。
ルートは次のとおりです。
Copy Source | Copy HTML<br/> ActionController::Routing ::Routes.draw do |map|<br/> map.logout '/logout' , :controller => 'sessions' , :action => 'destroy' <br/> map.login '/login' , :controller => 'sessions' , :action => 'new' <br/> map.register '/register' , :controller => 'users' , :action => 'create' <br/> map.signup '/signup' , :controller => 'users' , :action => 'new' <br/> map.resources :users<br/> map.resource :session<br/> end <br/>
ご覧のとおり、すべてがRESTに非常によく適合しています。
sessions/new [GET]
sessions [POST]
sessions [DELETE] logout
users/new [GET]
users [POST]
ルートオプションを使用することをお勧めします(ごく最近導入されましたが、どのバージョンか覚えていません):のみ、および:map.resourcesエントリを編集:users(map.resources:users ,: except => [:edit ,: update ,:破棄]など)。 たとえば、編集は別のルート:map.resource:profileに転送することをお勧めします(この場合、編集は次のようになります:/ profile / edit)。
app / models / user.rbモデルを見てみましょう:
Copy Source | Copy HTML<br/> require 'digest/sha1' <br/> <br/> class User < ActiveRecord::Base <br/> include Authentication<br/> include Authentication::ByPassword<br/> include Authentication::ByCookieToken<br/> <br/> validates_presence_of : login <br/> validates_length_of : login , :within => 3 .. 40 <br/> validates_uniqueness_of : login <br/> validates_format_of : login , :with => Authentication.login_regex, :message => Authentication.bad_login_message<br/> <br/> validates_format_of :name, :with => Authentication.name_regex, :message => Authentication.bad_name_message, :allow_nil => true <br/> validates_length_of :name, :maximum => 100 <br/> <br/> validates_presence_of : email <br/> validates_length_of : email , :within => 6 .. 100 <br/> validates_uniqueness_of : email <br/> validates_format_of : email , :with => Authentication.email_regex, :message => Authentication.bad_email_message<br/> <br/> attr_accessible : login , : email , :name, :password, :password_confirmation<br/> <br/> def self .authenticate( login , password)<br/> return nil if login .blank? || password.blank?<br/> u = find_by_login( login .downcase) # need to get the salt <br/> u && u.authenticated?(password) ? u : nil <br/> end <br/> <br/> def login =(value)<br/> write_attribute : login , (value ? value.downcase : nil )<br/> end <br/> <br/> def email =(value)<br/> write_attribute : email , (value ? value.downcase : nil )<br/> end <br/> end <br/>
原則として、ログインが電子メールではないことを私があまり好きではないことを除いて、興味深いことは何もありません。 これを修正するには、以下を実行する必要があります:エントリt.column:login ,: string ,: limit => 40をdb / migrate / xxxx_users.rb移行から削除します。
Copy Source | Copy HTML<br/> require 'digest/sha1' <br/> <br/> class User < ActiveRecord::Base <br/> include Authentication<br/> include Authentication::ByPassword<br/> include Authentication::ByCookieToken<br/> <br/> validates_format_of :name, :with => Authentication.name_regex, :message => Authentication.bad_name_message, :allow_nil => true <br/> validates_length_of :name, :maximum => 100 <br/> <br/> validates_presence_of : email <br/> validates_length_of : email , :within => 6 .. 100 <br/> validates_uniqueness_of : email <br/> validates_format_of : email , :with => Authentication.email_regex, :message => Authentication.bad_email_message<br/> <br/> attr_accessible : email , :name, :password, :password_confirmation<br/> <br/> def self .authenticate(login, password)<br/> return nil if login.blank? || password.blank?<br/> u = find_by_email(login.downcase) # need to get the salt <br/> u && u.authenticated?(password) ? u : nil <br/> end <br/> <br/> def email =(value)<br/> write_attribute : email , (value ? value.downcase : nil )<br/> end <br/> end <br/>
ファイルapp / views / users / new.html.erbも変更する必要があります:
< h1 > Sign up as a new user </ h1 > <br> <% @user.password = @user.password_confirmation = nil %> <br><br> <% = error_messages_for :user %> <br> <% form_for :user, :url => users_path do |f| - %> <br><br> < p > <% = label_tag 'email' %> < br /> <br> <% = f.text_field :email %> </ p > <br><br> < p > <% = label_tag 'password' %> < br /> <br> <% = f.password_field :password %> </ p > <br><br> < p > <% = label_tag 'password_confirmation' , 'Confirm Password' %> < br /> <br> <% = f.password_field :password_confirmation %> </ p > <br><br> < p > <% = label_tag 'name' %> < br /> <br> <% = f.text_field :name %> </ p > <br><br> < p > <% = submit_tag 'Sign up' %> </ p > <br> <% end - %> <br> <br> * This source code was highlighted with Source Code Highlighter .
すべて準備完了です! 移行を完了し、プロジェクトを実行するために残ります。
完全を期すために、ルートルートを追加できます。 ルートコントローラーの生成:
script/generate controller home index
config / routes.rbに追加:
map.root :controller => 'home'
ライトアウトを追加します(アプリ/ビュー/レイアウト/ application.html.erb):
< html > <br> < head > <br> < meta http-equiv ="Content-type" content ="text/html; charset=utf-8" /> <br> < title > auth demo </ title > <br> </ head > <br> < body > <br> <% = render : partial => 'users/user_bar' %> <br> <% = yield %> <br> </ body > <br> </ html > <br><br> * This source code was highlighted with Source Code Highlighter .
いくつかの説明。 コントローラー/ Wiihaで、logged_in関数を使用して「ログイン」を確認しますか? (true / false)現在許可されているユーザーへのアクセスは、current_userを介して実行されます。 記事に反映されていないいくつかの修正がある完成したプロジェクト 。