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
あと、なんかやることある?