大丈夫か? 俺www
んで、帰りにブックオフで「きのう何食べた? 2」と「不思議な少年 7」を買ってくる。
マンガ買うなんて、まだ余裕あるつもりなのか? 俺www
んじゃあ、もう一度、例のページの頭に戻って、roleに関するところのみピックアップして、やっていきますか。
で、ずうっと飛ばして、
$ script/generate scaffold Role rolename:string$ script/generate model Permission
から。
つうか、scaffold、いるのか?www
んで、db/migrate/*数字*_create_permissions.rb。
...ん?
って、これ、adminのデータ、作ってるよね?
じゃあ、その部分、飛ばして、別に作ろう。
class CreatePermissions <>def self.upcreate_table :permissions do |t|t.integer :role_id, :user_id, :null => falset.timestampsendenddef self.downdrop_table :permissionsendend
よし。
アレ?
*数字*_create_roles.rb、編集してないよね?
つうか、ここにも載ってないよね?
じゃあ、最新版restful_authentication_tutorialの方から拾ってくる方面で。
db/migrate/*数字*_create_roles.rb。
def self.upcreate_table "roles" do |t|t.string :nameend# generate the join tablecreate_table "roles_users", :id => false do |t|t.integer "role_id", "user_id"endadd_index "roles_users", "role_id"add_index "roles_users", "user_id"enddef self.downdrop_table "roles"drop_table "roles_users"end
ありゃ?
scaffoldの時にはrolenameだったのに、こっちはnameになってるな...
まあ、いいやwww
こっちを採用。
Role.nameの方が、Role.rolenameより自然だよね?
混同しそうだけどwwwwww
んじゃあ、modelの関連付け、しましょうか。
app/models/role.rb
class Role <>has_many :permissionshas_many :users, :through => :permissionsend
app/models/permission.rb
class Permission <>belongs_to :userbelongs_to :roleend
んで、app/models/user.rbにも関連付けを。
+ has_many :permissions+ has_many :roles, :through => :permissions
これで、userとroleとpermissionが結びついたよね?
ああ、あと、find_for_forget?とhas_role?メソッドも追加してるね。
+ def self.find_for_forget(email)+ find :first, :conditions => ['email = ? and activated_at IS NOT NULL', email]+ end++ def has_role?(rolename)+ self.roles.find_by_name(rolename) ? true : false+ end
次は、filter用のメソッドの追加。
lib/authenticated_system.rb
+ def role_requiered(role)+ unless logged_in? && @current_user.has_role?(role)+ if logged_in?+ permission_denied+ else+ store_referer+ access_denied+ end+ end+ end++ def administrator_role_required+ role_requiered('administrator')+ end
メソッド名は、それぞれ、っぽく変えといた;-p
んで、app/controllers/users_controller.rbにbefore_filterする。
+ before_filter :administrator_role_required, :only => [:index, :destroy, :enable]
んじゃあ、app/controllers/roles_controller.rbまで飛ばして。
class RolesController <>before_filter :administrator_role_requireddef index@user = User.find(params[:user_id])@all_roles = Role.find(:all)enddef update@user = User.find(params[:user_id])@role = Role.find(params[:id])unless @user.has_role?(@role.name)@user.roles << @roleendredirect_to :action => 'index'enddef destroy@user = User.find(params[:user_id])@role = Role.find(params[:id])if @user.has_role?(@role.name)@user.roles.delete(@role)endredirect_to :action => 'index'endend
そういえば、respond_toって、いままで付けてなかったな...
まあ、いいやwww
また今度。
次。roleのview。
scaffoldで生成したものの内、index以外はいらないんで、削除。
んで、partial作る。
app/views/roles/_role.html.erb<li><%= role.name %><% if @user.has_role?(role.name) %><%= link_to 'remove role', user_role_url(:id => role.id, :user_id => @user.id), :method => :delete %><% else %><%= link_to 'assign role', user_role_url(:id => role.id, :user_id => @user.id), :method => :put %><% end %></li>
んで、app/views/roles/index.html.erb
<h2>Roles for <%=h @user.nickname %></h2><h3>Roles assigned:</h3><ul><%= render :partial => 'role', :collection => @user.roles %></ul><h3>Roles available:</h3><ul><%= render :partial => 'role', :collection => (@all_roles - @user.roles) %></ul>
おk。
で、今まで敢えて作ってこなかったviewを。
まず、app/users/_user.html.erb
<tr class="<%= cycle('odd', 'even') %>"><td><%=h user.nickname %></td><td><%=h user.email %></td><td><%= user.enabled ? 'yes' : 'no' %><% unless user == current_user %><% if user.enabled %><%= link_to('disable', user_path(user.id), :method => :delete) %><% else %><%= link_to('enable', enable_user_path(user.id), :method => :put) %><% end %><% end %></td><td><%= link_to 'edit roles', user_roles_path(user) %>]</td></tr>
んで、app/views/users/index.html.erb。
<h2>All Users</h2><table><tr><th>Username</th><th>Email</th><th>Enabled?</th><th>Roles</th></tr><%= render :partial => 'user', :collection => @users %></table>
おk。
後は、adminユーザの初期データのマイグレーションですか。
これは、最新版restful_authentication_tutorialから持ってきたものを基にしよう。
$ script/generate migration AddAdminUserToUser
で、
db/migrate/*数字*_add_admin_user_to_user.rb
class AddAdminUserToUser <>def self.up#Be sure to change these settings for your initial admin userunless User.find_by_email("email@hogehoge.com")User.create(:nickname => "admin",:family_name => "管理者",:middle_name => "ザ",:given_name => "アドミン",:password => "password",:password_confirmation => "password",:email => "email@hogehoge.com")end#Admin role name should be "admin" for convenienceunless Role.find_by_name("administrator")Role.create(:name => "administrator")endadmin_user = User.find_by_email("email@hogehoge.com")admin_role = Role.find_by_name("administrator")admin_user.state = "active"admin_user.activated_at = Time.now.utcadmin_user.roles <<>admin_user.save(false)enddef self.downadmin_user = User.find_by_email("email@hogehoge.com")admin_role = Role.find_by_name("administrator")admin_user.roles = []admin_user.saveadmin_user.destroyadmin_role.destroyendend
どうよ?
0 件のコメント:
コメントを投稿