2008年12月8日月曜日

じゃあ、role機能でもやっちゃいますか。

職安にって、職業相談とやらを受けるも、なんか、ちょろっと話をしただけで終わったぞ?
大丈夫か? 俺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.up
create_table :permissions do |t|
t.integer :role_id, :user_id, :null => false
t.timestamps
end
end

def self.down
drop_table :permissions
end
end
よし。

アレ?
*数字*_create_roles.rb、編集してないよね?
つうか、ここにも載ってないよね?
じゃあ、最新版restful_authentication_tutorialの方から拾ってくる方面で。
db/migrate/*数字*_create_roles.rb。
def self.up
create_table "roles" do |t|
t.string :name
end
# generate the join table
create_table "roles_users", :id => false do |t|
t.integer "role_id", "user_id"
end
add_index "roles_users", "role_id"
add_index "roles_users", "user_id"
end

def self.down
drop_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 :permissions
has_many :users, :through => :permissions
end
app/models/permission.rb
class Permission <>
belongs_to :user
belongs_to :role
end
んで、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_required
def index
@user = User.find(params[:user_id])
@all_roles = Role.find(:all)
end
def update
@user = User.find(params[:user_id])
@role = Role.find(params[:id])
unless @user.has_role?(@role.name)
@user.roles << @role
end
redirect_to :action => 'index'
end
def destroy
@user = User.find(params[:user_id])
@role = Role.find(params[:id])
if @user.has_role?(@role.name)
@user.roles.delete(@role)
end
redirect_to :action => 'index'
end

end
そういえば、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 user
unless 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 convenience
unless Role.find_by_name("administrator")
Role.create(
:name => "administrator")
end

admin_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.utc
admin_user.roles <<>
admin_user.save(false)
end

def self.down
admin_user = User.find_by_email("email@hogehoge.com")
admin_role = Role.find_by_name("administrator")
admin_user.roles = []
admin_user.save
admin_user.destroy
admin_role.destroy
end
end
どうよ?


0 件のコメント: