friendly_id-method_scopes 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/.ruby-gemspec +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +20 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +29 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/coverage/.last_run.json +5 -0
- data/coverage/.resultset.json +676 -0
- data/coverage/.resultset.json.lock +0 -0
- data/friendly_id-method_scopes.gemspec +154 -0
- data/lib/friendly_id/method_scopes.rb +69 -0
- data/lib/friendly_id/method_scopes/version.rb +9 -0
- data/spec/controllers/authors_controller_spec.rb +20 -0
- data/spec/controllers/books_controller_spec.rb +20 -0
- data/spec/dummy/Rakefile +9 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/assets/stylesheets/scaffold.css +1 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/authors_controller.rb +18 -0
- data/spec/dummy/app/controllers/books_controller.rb +23 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/author.rb +12 -0
- data/spec/dummy/app/models/book.rb +16 -0
- data/spec/dummy/app/models/role.rb +10 -0
- data/spec/dummy/app/views/authors/index.html.haml +5 -0
- data/spec/dummy/app/views/authors/show.html.haml +5 -0
- data/spec/dummy/app/views/books/index.html.haml +5 -0
- data/spec/dummy/app/views/books/show.html.haml +5 -0
- data/spec/dummy/app/views/layouts/application.html.haml +10 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +44 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/rolify.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +6 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/migrate/20150621221655_create_books.rb +10 -0
- data/spec/dummy/db/migrate/20150621221732_create_authors.rb +10 -0
- data/spec/dummy/db/migrate/20150622182214_rolify_create_roles.rb +19 -0
- data/spec/dummy/db/schema.rb +48 -0
- data/spec/dummy/db/seeds.rb +0 -0
- data/spec/dummy/db/seeds/authors.seeds.rb +2 -0
- data/spec/dummy/db/seeds/books.seeds.rb +9 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/author.rb +6 -0
- data/spec/factories/book.rb +15 -0
- data/spec/models/author_spec.rb +11 -0
- data/spec/models/book_spec.rb +15 -0
- data/spec/rails_helper.rb +45 -0
- data/spec/routing/authors_routing_spec.rb +15 -0
- data/spec/routing/books_routing_spec.rb +15 -0
- data/spec/spec_helper.rb +94 -0
- data/spec/support/authors.rb +4 -0
- data/spec/support/books_with_authors.rb +7 -0
- metadata +306 -0
File without changes
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: friendly_id-method_scopes 0.1.5 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "friendly_id-method_scopes"
|
9
|
+
s.version = "0.1.5"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Karen Lundgren"]
|
14
|
+
s.date = "2015-06-22"
|
15
|
+
s.description = "FriendlyId Extension to allow method scopes, in addition to column and relationship scopes."
|
16
|
+
s.email = "karen.e.lundgren@gmail.com"
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".rspec",
|
22
|
+
".ruby-gemspec",
|
23
|
+
".ruby-version",
|
24
|
+
".travis.yml",
|
25
|
+
"Gemfile",
|
26
|
+
"MIT-LICENSE",
|
27
|
+
"README.rdoc",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"coverage/.last_run.json",
|
31
|
+
"coverage/.resultset.json",
|
32
|
+
"coverage/.resultset.json.lock",
|
33
|
+
"friendly_id-method_scopes.gemspec",
|
34
|
+
"lib/friendly_id/method_scopes.rb",
|
35
|
+
"lib/friendly_id/method_scopes/version.rb",
|
36
|
+
"spec/controllers/authors_controller_spec.rb",
|
37
|
+
"spec/controllers/books_controller_spec.rb",
|
38
|
+
"spec/dummy/Rakefile",
|
39
|
+
"spec/dummy/app/assets/javascripts/application.js",
|
40
|
+
"spec/dummy/app/assets/stylesheets/application.css",
|
41
|
+
"spec/dummy/app/assets/stylesheets/scaffold.css",
|
42
|
+
"spec/dummy/app/controllers/application_controller.rb",
|
43
|
+
"spec/dummy/app/controllers/authors_controller.rb",
|
44
|
+
"spec/dummy/app/controllers/books_controller.rb",
|
45
|
+
"spec/dummy/app/models/.keep",
|
46
|
+
"spec/dummy/app/models/author.rb",
|
47
|
+
"spec/dummy/app/models/book.rb",
|
48
|
+
"spec/dummy/app/models/role.rb",
|
49
|
+
"spec/dummy/app/views/authors/index.html.haml",
|
50
|
+
"spec/dummy/app/views/authors/show.html.haml",
|
51
|
+
"spec/dummy/app/views/books/index.html.haml",
|
52
|
+
"spec/dummy/app/views/books/show.html.haml",
|
53
|
+
"spec/dummy/app/views/layouts/application.html.haml",
|
54
|
+
"spec/dummy/bin/bundle",
|
55
|
+
"spec/dummy/bin/rails",
|
56
|
+
"spec/dummy/bin/rake",
|
57
|
+
"spec/dummy/bin/setup",
|
58
|
+
"spec/dummy/config.ru",
|
59
|
+
"spec/dummy/config/application.rb",
|
60
|
+
"spec/dummy/config/boot.rb",
|
61
|
+
"spec/dummy/config/database.yml",
|
62
|
+
"spec/dummy/config/environment.rb",
|
63
|
+
"spec/dummy/config/environments/development.rb",
|
64
|
+
"spec/dummy/config/environments/production.rb",
|
65
|
+
"spec/dummy/config/environments/test.rb",
|
66
|
+
"spec/dummy/config/initializers/assets.rb",
|
67
|
+
"spec/dummy/config/initializers/backtrace_silencers.rb",
|
68
|
+
"spec/dummy/config/initializers/cookies_serializer.rb",
|
69
|
+
"spec/dummy/config/initializers/filter_parameter_logging.rb",
|
70
|
+
"spec/dummy/config/initializers/inflections.rb",
|
71
|
+
"spec/dummy/config/initializers/mime_types.rb",
|
72
|
+
"spec/dummy/config/initializers/rolify.rb",
|
73
|
+
"spec/dummy/config/initializers/session_store.rb",
|
74
|
+
"spec/dummy/config/initializers/wrap_parameters.rb",
|
75
|
+
"spec/dummy/config/locales/en.yml",
|
76
|
+
"spec/dummy/config/routes.rb",
|
77
|
+
"spec/dummy/config/secrets.yml",
|
78
|
+
"spec/dummy/db/migrate/20150621221655_create_books.rb",
|
79
|
+
"spec/dummy/db/migrate/20150621221732_create_authors.rb",
|
80
|
+
"spec/dummy/db/migrate/20150622182214_rolify_create_roles.rb",
|
81
|
+
"spec/dummy/db/schema.rb",
|
82
|
+
"spec/dummy/db/seeds.rb",
|
83
|
+
"spec/dummy/db/seeds/authors.seeds.rb",
|
84
|
+
"spec/dummy/db/seeds/books.seeds.rb",
|
85
|
+
"spec/dummy/lib/assets/.keep",
|
86
|
+
"spec/dummy/log/.keep",
|
87
|
+
"spec/dummy/public/404.html",
|
88
|
+
"spec/dummy/public/422.html",
|
89
|
+
"spec/dummy/public/500.html",
|
90
|
+
"spec/dummy/public/favicon.ico",
|
91
|
+
"spec/factories/author.rb",
|
92
|
+
"spec/factories/book.rb",
|
93
|
+
"spec/models/author_spec.rb",
|
94
|
+
"spec/models/book_spec.rb",
|
95
|
+
"spec/rails_helper.rb",
|
96
|
+
"spec/routing/authors_routing_spec.rb",
|
97
|
+
"spec/routing/books_routing_spec.rb",
|
98
|
+
"spec/spec_helper.rb",
|
99
|
+
"spec/support/authors.rb",
|
100
|
+
"spec/support/books_with_authors.rb"
|
101
|
+
]
|
102
|
+
s.homepage = "http://www.gemvein.com/museum/cases/friendly_id-method_scopes"
|
103
|
+
s.rubygems_version = "2.4.5"
|
104
|
+
s.summary = "FriendlyId Extension to allow method scopes."
|
105
|
+
|
106
|
+
if s.respond_to? :specification_version then
|
107
|
+
s.specification_version = 4
|
108
|
+
|
109
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
110
|
+
s.add_runtime_dependency(%q<rails>, ["~> 4"])
|
111
|
+
s.add_runtime_dependency(%q<friendly_id>, ["~> 5"])
|
112
|
+
s.add_runtime_dependency(%q<jeweler>, ["~> 2"])
|
113
|
+
s.add_runtime_dependency(%q<coveralls>, ["~> 0.8"])
|
114
|
+
s.add_development_dependency(%q<sqlite3>, ["~> 1"])
|
115
|
+
s.add_development_dependency(%q<rspec-rails>, ["~> 3.3"])
|
116
|
+
s.add_development_dependency(%q<shoulda-matchers>, ["~> 2.8"])
|
117
|
+
s.add_development_dependency(%q<rolify>, ["~> 4"])
|
118
|
+
s.add_development_dependency(%q<seedbank>, ["~> 0.3"])
|
119
|
+
s.add_development_dependency(%q<factory_girl_rails>, ["~> 4.5"])
|
120
|
+
s.add_development_dependency(%q<faker>, ["~> 1.4"])
|
121
|
+
s.add_development_dependency(%q<haml>, ["~> 4"])
|
122
|
+
s.add_development_dependency(%q<database_cleaner>, ["~> 1.4"])
|
123
|
+
else
|
124
|
+
s.add_dependency(%q<rails>, ["~> 4"])
|
125
|
+
s.add_dependency(%q<friendly_id>, ["~> 5"])
|
126
|
+
s.add_dependency(%q<jeweler>, ["~> 2"])
|
127
|
+
s.add_dependency(%q<coveralls>, ["~> 0.8"])
|
128
|
+
s.add_dependency(%q<sqlite3>, ["~> 1"])
|
129
|
+
s.add_dependency(%q<rspec-rails>, ["~> 3.3"])
|
130
|
+
s.add_dependency(%q<shoulda-matchers>, ["~> 2.8"])
|
131
|
+
s.add_dependency(%q<rolify>, ["~> 4"])
|
132
|
+
s.add_dependency(%q<seedbank>, ["~> 0.3"])
|
133
|
+
s.add_dependency(%q<factory_girl_rails>, ["~> 4.5"])
|
134
|
+
s.add_dependency(%q<faker>, ["~> 1.4"])
|
135
|
+
s.add_dependency(%q<haml>, ["~> 4"])
|
136
|
+
s.add_dependency(%q<database_cleaner>, ["~> 1.4"])
|
137
|
+
end
|
138
|
+
else
|
139
|
+
s.add_dependency(%q<rails>, ["~> 4"])
|
140
|
+
s.add_dependency(%q<friendly_id>, ["~> 5"])
|
141
|
+
s.add_dependency(%q<jeweler>, ["~> 2"])
|
142
|
+
s.add_dependency(%q<coveralls>, ["~> 0.8"])
|
143
|
+
s.add_dependency(%q<sqlite3>, ["~> 1"])
|
144
|
+
s.add_dependency(%q<rspec-rails>, ["~> 3.3"])
|
145
|
+
s.add_dependency(%q<shoulda-matchers>, ["~> 2.8"])
|
146
|
+
s.add_dependency(%q<rolify>, ["~> 4"])
|
147
|
+
s.add_dependency(%q<seedbank>, ["~> 0.3"])
|
148
|
+
s.add_dependency(%q<factory_girl_rails>, ["~> 4.5"])
|
149
|
+
s.add_dependency(%q<faker>, ["~> 1.4"])
|
150
|
+
s.add_dependency(%q<haml>, ["~> 4"])
|
151
|
+
s.add_dependency(%q<database_cleaner>, ["~> 1.4"])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module FriendlyId
|
2
|
+
module MethodScopes
|
3
|
+
|
4
|
+
# FriendlyId::Config.use will invoke this method when present, to allow
|
5
|
+
# loading dependent modules prior to overriding them when necessary.
|
6
|
+
def self.setup(model_class)
|
7
|
+
model_class.friendly_id_config.use :slugged
|
8
|
+
end
|
9
|
+
|
10
|
+
# Sets up behavior and configuration options for FriendlyId::MethodScopes's method_scopes slugs
|
11
|
+
# feature.
|
12
|
+
def self.included(model_class)
|
13
|
+
model_class.class_eval do
|
14
|
+
friendly_id_config.class.send :include, Configuration
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# # This doesn't work yet, but will be used to hook up to the history module
|
19
|
+
# def serialized_scope
|
20
|
+
# friendly_id_config.scope_method_columns.sort.map { |column, method| "#{column}:#{send(method)}" }.join(",")
|
21
|
+
# end
|
22
|
+
|
23
|
+
def scope_for_slug_generator
|
24
|
+
relation = self.class.unscoped.friendly
|
25
|
+
friendly_id_config.scope_method_columns.each do |column, method|
|
26
|
+
relation = relation.where(column => send(method))
|
27
|
+
end
|
28
|
+
primary_key_name = self.class.primary_key
|
29
|
+
relation.where(self.class.arel_table[primary_key_name].not_eq(send(primary_key_name)))
|
30
|
+
end
|
31
|
+
private :scope_for_slug_generator
|
32
|
+
|
33
|
+
def slug_generator
|
34
|
+
friendly_id_config.slug_generator_class.new(scope_for_slug_generator)
|
35
|
+
end
|
36
|
+
private :slug_generator
|
37
|
+
|
38
|
+
module Configuration
|
39
|
+
attr_accessor :scope_methods
|
40
|
+
|
41
|
+
def scope_method_columns
|
42
|
+
[@scope_methods].flatten.map { |s|
|
43
|
+
column = (method_foreign_key(s) or method_so_id(s) or s).to_s
|
44
|
+
my_method = (method_foreign_key(s) or method_so_method(s) or s).to_s
|
45
|
+
[column, my_method]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def method_so_id(scope)
|
52
|
+
if model_class.method_defined? scope
|
53
|
+
:id
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def method_so_method(scope)
|
58
|
+
if model_class.method_defined? scope
|
59
|
+
scope
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_foreign_key(scope)
|
64
|
+
reflection = model_class.reflections[scope] || model_class.reflections[scope.to_s]
|
65
|
+
reflection.try(:foreign_key)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe AuthorsController do
|
4
|
+
include_context 'books with authors'
|
5
|
+
|
6
|
+
describe "GET #index" do
|
7
|
+
it "assigns all authors as @authors" do
|
8
|
+
get :index
|
9
|
+
expect(assigns(:authors)).to eq([first_author, second_author])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "GET #show" do
|
14
|
+
it "assigns the requested author as @author" do
|
15
|
+
get :show, {:id => first_author.to_param}
|
16
|
+
expect(assigns(:author)).to eq(first_author)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe BooksController do
|
4
|
+
include_context 'books with authors'
|
5
|
+
|
6
|
+
describe "GET #index" do
|
7
|
+
it "assigns author's books as @books" do
|
8
|
+
get :index, author_id: first_author.to_param
|
9
|
+
expect(assigns(:books)).to eq([book_a, book_b_first])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "GET #show" do
|
14
|
+
it "assigns the requested book as @book" do
|
15
|
+
get :show, author_id: first_author.to_param, id: book_b_first.to_param
|
16
|
+
expect(assigns(:book)).to eq(book_b_first)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
+
|
4
|
+
require File.expand_path('../config/application', __FILE__)
|
5
|
+
|
6
|
+
Rails.application.load_tasks
|
7
|
+
|
8
|
+
require 'seedbank'
|
9
|
+
Seedbank.load_tasks if defined?(Seedbank)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any styles
|
10
|
+
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
|
11
|
+
* file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1 @@
|
|
1
|
+
/* I hate this file. */
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class AuthorsController < ApplicationController
|
2
|
+
before_action :set_author, only: :show
|
3
|
+
|
4
|
+
# GET /authors
|
5
|
+
def index
|
6
|
+
@authors = Author.all
|
7
|
+
end
|
8
|
+
|
9
|
+
# GET /authors/author-slug
|
10
|
+
def show
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
# Use callbacks to share common setup or constraints between actions.
|
15
|
+
def set_author
|
16
|
+
@author = Author.friendly.find(params[:id])
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class BooksController < ApplicationController
|
2
|
+
before_action :set_author
|
3
|
+
before_action :set_book, only: :show
|
4
|
+
|
5
|
+
# GET /authors/author-slug/books
|
6
|
+
def index
|
7
|
+
@books = @author.books
|
8
|
+
end
|
9
|
+
|
10
|
+
# GET /authors/author-slug/books/book-slug
|
11
|
+
def show
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
# Use callbacks to share common setup or constraints between actions.
|
16
|
+
def set_book
|
17
|
+
@book = @author.books.friendly.find(params[:id])
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_author
|
21
|
+
@author = Author.friendly.find(params[:author_id])
|
22
|
+
end
|
23
|
+
end
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Book < ActiveRecord::Base
|
2
|
+
# Rolify Gem
|
3
|
+
resourcify
|
4
|
+
|
5
|
+
# FriendlyId Gem
|
6
|
+
extend FriendlyId
|
7
|
+
friendly_id :title, use: [:slugged, :method_scopes], scope_methods: :also_written_by
|
8
|
+
|
9
|
+
def authors
|
10
|
+
Author.with_role(:author, self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def also_written_by
|
14
|
+
Book.where(id: authors.collect { |o| o.books.ids }.flatten )
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Role < ActiveRecord::Base
|
2
|
+
has_and_belongs_to_many :authors, :join_table => :authors_roles
|
3
|
+
belongs_to :resource, :polymorphic => true
|
4
|
+
|
5
|
+
validates :resource_type,
|
6
|
+
:inclusion => { :in => Rolify.resource_types },
|
7
|
+
:allow_nil => true
|
8
|
+
|
9
|
+
scopify
|
10
|
+
end
|