Nagy projekt második rész. Felhasználók.
Filed under Rails
Eljött az idő, hogy csináljunk a projekthez jó kis felhasználó kezelést. Ehhez létre kell hoznunk egy User modelt, be kell állítanunk, hogy a sessionoket, db-ben tároljuk és ne cookieban. Most már csak nagyobb vonalakban fogom leírni a lépéseket, ha valaki valamit nem ért, akkor kérdezze meg a kommentekben.
Mielőtt belevágnánk el kell mondanom, hogy van egy rakat plugin authentikációra. Ezek közt vannak nagyon jók, viszont meg kell, hogy mondjam ezeket én nem használom, az évek során megírtam a magam kis modulját erre, ami eddig mindig bevált. Korábban meg-meg néztem még 1.2.6os Railsnél ezeket a pluginokat, viszont akkor vagy sok volt a tudásuk, vagy kevés, és így kezdtem neki egyedinek az írásához. Meg ugye sajnos a nyílt forrásnak meg van az a hátránya, ami egyben az előnye is, hogy sokan látják, és a hibák hamarabb kiderülnek, amik authentikációnál nagy kockázatot jelentenek.
Nos akkor hozzuk létre a User modelt egyenlőre bőven elég a username és password paraméterekkel. Ha megvan akkor szépen migrateljünk. Ezután hozzunk létre egy users controllert, index, new, update, show viewkal.Állítsuk be, hogy REST legyen. Ezek után készítsük el a new, createt a movies-hoz hasonlóan.
Most már kicsit pofozzuk ki az application.html.erbnket a layout mappában. Adjunk hozzá doctypot és “dobozoljunk” kicsit. Csináljunk egy új partialt a layout mappába, legyen a neve, mondjuk _login_box.html.erb. Ezt a partialt rendereljük a side divbe.
_login_box.html.erb
<div id="login"> <%= link_to "regisztáció", new_user_path %> </div>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Filmek adatbázisa</title>
</head>
<body>
<div id="wrapper">
<div id="side">
<%= render :partial=>"layouts/login_box"%>
</div>
<div id="content">
<%= yield %>
</div>
</div>
</body>
</html>Mielőtt tovább mennénk gyorsan állítsunk be egy-két dolgot. Először is jelenleg a sessionöket a cookieban tároljuk. Ezt állítsuk át, hogy db-ben tároljuk őket. Nézzünk bele a config/environment.rb-be és nézzünk rá az 55. sorra. Itt oldjuk fel a kommentet a 58.sorról.
# Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rake db:sessions:create") config.action_controller.session_store = :active_record_store
Majd futassuk le a fentebb lévő rake parancsot, akár Netbeansben akár parancssorban.
Netbeansben jobb gomb Run Rake Task -> db->session->create. Ezután migrateljünk.
Viszont most ki kell lőni a cookie based sessiont, ehhez viszont ki kell kommentálni a 50-53. sort.
# config.action_controller.session = { # :session_key =>; '_MovieDb_session', # :secret =>'bab4db93dfb6ddd51fe9c8d88886e939a6f0bf70e406ee6c808bd583c78903b3f8248f9f1ed423548f8e975b2c9e0fa96230ffcb7683a2725ac1f2abd92d852c' # }
Van még egy dolgunk ezzel kapcsolatban. Menjünk az application controllerünkbe és ott láthatjuk azt a leírást, hogy ha nem cookie session storet használunk akkor a :secretet oldjuk fel.
Ezek után, ha futtatjuk a szervert és megnyitva az oldalt nem dob hibát akkor jók vagyunk, ha valami hibát dob (leginkább 500 errort) akkor valamit rosszul állítottunk be.
Dobjuk össze gyorsan a regisztrációhoz a new user-nek a view-t.
<%= error_messages_for :user %> <%form_for :user, :url=>users_path do |f| %> <p> <%= f.label(:username, "Felahsználónév: ") %> <%= f.text_field :username %></p> <p> <%= f.label(:password, "Jelszó: ") %> <%= f.password_field(:password)%> </p> <%= submit_tag "Regisztráció" %> <% end %>
Mivel itt ugye kényes adatokat kezelünk ezért egy-két dolgot be kell állítanunk.
- Egyedi felhasználónevek.
- Kitöltés kötelező.
- Jelszó tárolása kódolva az adatbázisban.
- Bizonyos tartalmak átírása kívülről.
Ezek beállításához a User modellhez kell egy-két sort hozzáadnunk, hisz ugye mikor a create metódust meghívjuk akkor az az átadott paraméterekből létrehoz egy új egyedet a User modellből.
#a jelszo kodolashoz szuksegvan ra require 'digest/sha2' class User < ActiveRecord::Base #ne lehessen kivulrol semmilyen modon meghivni password valtozo get/set fugvenyeit. attr_protected :password #Letrehozzuk a :pass valtozohoz a get/set fugvenyt. attr_accessor :pass #egyedi felhasznalonev validates_uniqueness_of :username, :case_sensitive => false #kitolts kotelezo a kovetkezokre validates_presence_of :username, :message => "Felhasználónév kitöltése kötelező" validates_presence_of :pass, :message=>"Jelszó kitőltése kötelező" validates_presence_of :pass_confirmation, :message=>"Jelszó megerősítés kitőltése kötelező" #jelszo megerosites validates_confirmation_of :pass, :message=>"A jelszavak nem egyeznek!" #jelszo es felhasznalonev hossza validates_length_of :username, :within => 3..64, :too_short=>"Min hossz 3", :too_long=>"Max 64." validates_length_of :pass, :within => 4..20, :too_long => "Túl hosszú max 20.", :too_short=>"Min hossz 4" #mielott elmentjuk def before_save self.password = User.encrypt(pass) if !self.pass.blank? end protected def self.encrypt(string) return Digest::SHA256.hexdigest(string) end end
Közben átírtam kicsit a new viewt.
<%= error_messages_for :user %> <%form_for :user, :url=>users_path do |f| %> <p> <%= f.label(:username, "Felahsználónév: ") %> <%= f.text_field :username %></p> <p> <%= f.label(:pass, "Jelszó: ") %> <%= f.password_field(:pass)%> </p> <p> <%= f.label(:pass_confirmation, "Jelszó: ") %> <%= f.password_field(:pass_confirmation)%> </p> <%= submit_tag "Regisztráció" %> <% end %>
Ami a User modellből magyarázatra szorul az a before_save metódus. A railsbe alapból be van építve egy rakat dolog. Az ActiveRecordeba beépítették ezeket a before, after metódusokat, amik értelemszerűen a nevük szerint futnak le. Itt a lista.
Most, hogy már a regisztrációnk szépen fut 1 valamit még nem látunk. Ezek pedig a flashek. Ahhoz, hogy lássuk őket adjuk hozzá a layoutunkhoz a következő sorokat, a body rész tetejére valahova, de igazából bárhova ahol szeretnénk, hogy ezek megjelenjenek.
<% if flash[:notice] -%>
<div id="notice"><%= flash[:notice] %></div>
<% end -%>
<% if flash[:error] -%>
<div id="error"><%= flash[:error] %></div>
<% end -%>Most próbáljuk ki, hogy működnek-e a dolgok. A hibák jelenleg még angolul jelennek meg(kivéve a mi felirataink), ehhez viszont egy-két dolgot overrideolni kell. Ezt majd később.
Ezzel most kész is lennénk. Most adjunk kis csst a rendszerbe, mert így kezd nagyon csúnya lenni.
body { background-color: #666; margin: 0; padding: 0; font-family: Helvetica, Arial, sans-serif; } div#wrapper { padding: 0; margin: 0 auto 0 auto; position: relative; border: 10px solid #ccc; width: 980px; } #content { float: left; background-color: #fff; width: 810px; padding: 10px 10px 20px 10px; overflow: hidden; } div#side { width: 150px; height: 400px; float: left; background-color: #606060; } div#errorExplanation.errorExplanation { background-color: #ffe4d5; } div#notice { color: #5eaa5a; background-color: white; } .clear{ clear: both; } #errorExplanation h2 { color: #ff0e00; } * html #content { height: 1%; }
application.erb.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Filmek adatbázisa</title>
<%= stylesheet_link_tag "standard" %>
</head>
<body>
<div id="wrapper">
<% if flash[:notice] -%>
<div id="notice"><%= flash[:notice] %></div>
<% end -%>
<% if flash[:error] -%>
<div id="error"><%= flash[:error] %></div>
<% end -%>
<div id="side">
<%= render :partial=>"layouts/login_box"%>
</div>
<div id="content">
<%= yield %>
</div>
<div class="clear"> </div>
</div>
</body>
</html>Hozzáadtuk a stylesheetet egy jó kis helper metódussal.
Így sem lett sokkal szebb viszont átláthatóbb
. Remélem még a mai nap folyamán lesz idő megírni az authentikációt is. Holnapig azt is postolom.
Jó olvasgatást!
júl23











július 23, 2008 at 8:49 du.
Hello!
Mi ez a sok gt? Pl.::message =>
Csak valami karakterhiba?
július 23, 2008 at 8:50 du.
hupsz, igen, koszi hogy szóltál javítom.
november 5, 2008 at 3:13 de.
az eredményt láthatnánk valahol?
november 5, 2008 at 11:47 de.
Sajnos ezt a példát nem raktam fel, és nem is tervezem, hogy felrakom. Majd a forrást lehet 1ben kirakom egy zipben és akkor azt tudjátok futtatni.
december 17, 2008 at 3:45 du.
na ezt is kivégeztem, klafa cikk, de egy valami “bugos”. amikor regisztráltam, és lefut a redirect: redirect_to users_path akkor az a users model index.html.erb fájlára dob. ami üres. gondolom ez már egyéni szocprobléma hogy hova irányitom a usert reg után