fugafugaにrole_requirementをセットアップ。

※「APP_CONFIG~」は、config/config.ymlで定数として定義しています。


とりあえず、生成。

$ script/generate roles Role User


で、マイグレーション・ファイルの修正。

# db/migrate/*数字*_create_roles.rb

(略)
     create_table "roles" do |t|
       t.string  :name
+      t.text    :description
     end
(略)


で、生成されたtest/fixtures/roles.ymlとroles_users.ymlをspec/fixturesへ。

$ mv test/fixtures/roles.yml spec/fixtures/
$ mv test/fixtures/roels_users.yml spec/fixtures/


で、フィクスチャの修正(全文)。

# spec/roles.yml

owner_role:
  id:           1
  name:         <%= APP_CONFIG["role"]["owner"]["name"] %>
  description:  <%= APP_CONFIG["role"]["owner"]["description"] %>
administrator_role:
  id:           2
  name:         <%= APP_CONFIG["role"]["administrator"]["name"] %>
  description:  <%= APP_CONFIG["role"]["administrator"]["description"] %>
registered_user_role:
  id:           3
  name:         <%= APP_CONFIG["role"]["registered_user"]["name"] %>
  description:  <%= APP_CONFIG["role"]["registered_user"]["description"] %>
# spec/roles_users.yml

owner_is_owner:
  user_id: <%= User.find(:first, :conditions => {:email => APP_CONFIG["owner"]["email"]}).id %> # owner
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["owner"]["name"]}).id %> # owner role
owner_is_administrator:
  user_id: <%= User.find(:first, :conditions => {:email => APP_CONFIG["owner"]["email"]}).id %> # owner
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["administrator"]["name"]}).id %> # administrator role

admin_is_administrator:
  user_id: <%= User.find(:first, :conditions => {:email => "admin@example.com"}).id %>
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["administrator"]["name"]}).id %> # administrator role
admin_is_registered_user:
  user_id: <%= User.find(:first, :conditions => {:email => "admin@example.com"}).id %>
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["registered_user"]["name"]}).id %> # registered_user role

quentin_is_registered_user:
  user_id: <%= User.find(:first, :conditions => {:email => "quentin@example.com"}).id %>
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["registered_user"]["name"]}).id %> # registered_user role

aaron_is_registered_user:
  user_id: <%= User.find(:first, :conditions => {:email => "aaron@example.com"}).id %>
  role_id: <%= Role.find(:first, :conditions => {:name => APP_CONFIG["role"]["registered_user"]["name"]}).id %> # registered_user role


で、生成されたtest/fixtures/users.ymlの内容を加工してspec/fixtures/users.ymlに追記して、削除。

# spec/fixtures/users.yml

(略)
+
+admin:
+  id: 14
+  email: admin@example.com
+  name: admin
+  salt: 7e3041ebc2fc05a40c60028e2c4901a81035d3cd
+  crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
+  # activation_code: adminscode # only if you're activating new signups
+  created_at: <%= 1.days.ago.to_s :db %>
$ rm test/fixtures/users.yml


で、specの生成。

$ script/generate rspec_model Role
overwrite app/ナントカ? (enter "h" for help) [Ynaqdh]

とか聞かれた時には、すかさず「n("ナニを言ってるんだオマエは"の略)」を入力。


で、rolesとroles_usersの初期データのマイグレーション(全文)。

$ script/generate migration AddInitialDataToRoles
# db/migrate/*数字*_add_initial_data_to_roles.rb

require "active_record/fixtures"

class AddInitialDataToRoles < ActiveRecord::Migration
  def self.up
    down

    directory = "spec/fixtures"
    Fixtures.create_fixtures(directory, "roles")
  end

  def self.down
    Role.delete_all
  end
end
$ script/generate migration AddInitialDataToRolesUsers
# db/migrate/*数字*_add_initial_data_to_roles_users.rb

require "active_record/fixtures"

class AddInitialDataToRoles < ActiveRecord::Migration
  def self.up
    down

    directory = "spec/fixtures"
    Fixtures.create_fixtures(directory, "roles_users")
  end

  def self.down
    
  end
end

アレ? まいったな...
self.down、どう書いたらイイんだろう?
中間テーブルって、モデルじゃないから、delete_allとか使えないしな...
drop_tableして、create_tableしようか?www


まあ、あとで考えようwww


で、マイグレート。

$ rake db:migrate


んで、Roleモデルに、Userモデルとのhabtmを。

 class Role < ActiveRecord::Base

+  has_and_belongs_to_many :users
 end


あと、ジェネレータにmodels/user.rbへ追記されたコードの修正

   def has_role?(role_in_question)
     @_list ||= self.roles.collect(&:name)
-    return true if @_list.include?("admin")
+    return true if @_list.include?(APP_CONFIG["role"]["administrator"]["name"])
     (@_list.include?(role_in_question.to_s) )
   end


あと、なんかやることある?