plutonium 0.15.7 → 0.15.9
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 +4 -4
- data/README.md +19 -81
- data/app/assets/plutonium.css +1 -1
- data/docs/.vitepress/config.ts +1 -0
- data/docs/guide/getting-started/index.md +4 -1
- data/docs/guide/tutorial.md +403 -0
- data/docs/index.md +19 -15
- data/docs/public/tutorial/plutonium-association-panel.png +0 -0
- data/docs/public/tutorial/plutonium-dashboard.png +0 -0
- data/docs/public/tutorial/plutonium-login-page.png +0 -0
- data/docs/public/tutorial/plutonium-nested-form.png +0 -0
- data/docs/public/tutorial/plutonium-posts-dashboard-customized.png +0 -0
- data/docs/public/tutorial/plutonium-posts-dashboard.png +0 -0
- data/docs/public/tutorial/plutonium-posts-detail-customized.png +0 -0
- data/docs/public/tutorial/plutonium-posts-detail.png +0 -0
- data/docs/public/tutorial/plutonium-publish-post.png +0 -0
- data/lib/generators/pu/core/assets/templates/tailwind.config.js +11 -1
- data/lib/generators/pu/extra/colorized_logger/colorized_logger_generator.rb +21 -0
- data/lib/generators/pu/extra/colorized_logger/templates/config/initializers/colorized_logger.rb +22 -0
- data/lib/generators/pu/gem/standard/standard_generator.rb +1 -1
- data/lib/plutonium/core/controllers/authorizable.rb +1 -1
- data/lib/plutonium/resource/controller.rb +12 -8
- data/lib/plutonium/resource/controllers/authorizable.rb +2 -2
- data/lib/plutonium/resource/controllers/presentable.rb +15 -4
- data/lib/plutonium/ui/dyna_frame/host.rb +1 -1
- data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +73 -70
- data/lib/plutonium/ui/table/resource.rb +1 -1
- data/lib/plutonium/version.rb +1 -1
- data/package-lock.json +2 -2
- data/package.json +1 -1
- data/tailwind.config.js +11 -1
- data/tailwind.options.js +7 -1
- metadata +14 -2
data/docs/.vitepress/config.ts
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# Getting Started with Plutonium
|
2
2
|
|
3
3
|
<!--
|
4
|
-
This guide covers getting up and running with Plutonium.
|
5
4
|
|
6
5
|
After reading this guide, you will know:
|
7
6
|
|
@@ -10,6 +9,10 @@ After reading this guide, you will know:
|
|
10
9
|
- The basic principles of Resource design.
|
11
10
|
- How to quickly generate the starting pieces of a Plutonium application.
|
12
11
|
-->
|
12
|
+
This guide covers getting up and running with Plutonium.
|
13
|
+
It is intended to be a more detailed guide.
|
14
|
+
|
15
|
+
If you're interested in a quick start, check out our [tutorial](/guide/tutorial).
|
13
16
|
|
14
17
|
## Prerequisites
|
15
18
|
|
@@ -0,0 +1,403 @@
|
|
1
|
+
# Building a Blog with Plutonium
|
2
|
+
|
3
|
+
# Building a Blog with Plutonium
|
4
|
+
|
5
|
+
> **Quick Links:**
|
6
|
+
> - 🔍 [Tutorial Demo](https://github.com/radioactive-labs/plutonium-app)
|
7
|
+
> - 📂 [Tutorial Source Code](https://github.com/radioactive-labs/plutonium-app)
|
8
|
+
|
9
|
+
This tutorial walks through building a blog application using Plutonium. You'll learn how to:
|
10
|
+
|
11
|
+
- Set up authentication using Rodauth
|
12
|
+
- Create a blog feature package
|
13
|
+
- Build a dashboard/portal
|
14
|
+
- Implement posts and comments
|
15
|
+
- Add interactive actions
|
16
|
+
- Configure scoping and authorization
|
17
|
+
|
18
|
+
[Rest of the tutorial content remains exactly the same...]
|
19
|
+
|
20
|
+
## Initial Setup
|
21
|
+
|
22
|
+
Let's start by creating a new Rails application with Plutonium:
|
23
|
+
|
24
|
+
```bash
|
25
|
+
rails new plutonium_app -a propshaft -j esbuild -c tailwind \
|
26
|
+
-m https://radioactive-labs.github.io/plutonium-core/templates/plutonium.rb
|
27
|
+
```
|
28
|
+
|
29
|
+
This creates a new Rails application with:
|
30
|
+
- Propshaft as the asset pipeline
|
31
|
+
- esbuild for JavaScript bundling
|
32
|
+
- Tailwind CSS for styling
|
33
|
+
- Plutonium's base configuration
|
34
|
+
|
35
|
+
## Setting Up Authentication
|
36
|
+
|
37
|
+
Next, let's add authentication using Rodauth:
|
38
|
+
|
39
|
+
```bash
|
40
|
+
# Generate Rodauth configuration
|
41
|
+
rails generate pu:rodauth:install
|
42
|
+
|
43
|
+
# Generate user account setup
|
44
|
+
rails generate pu:rodauth:account user
|
45
|
+
rails db:migrate
|
46
|
+
```
|
47
|
+
|
48
|
+
This sets up:
|
49
|
+
- A User model with authentication
|
50
|
+
- Login/logout functionality
|
51
|
+
- Account verification via email
|
52
|
+
- Password reset capabilities
|
53
|
+
|
54
|
+

|
55
|
+
|
56
|
+
The key files created include:
|
57
|
+
- `app/models/user.rb` - The User model
|
58
|
+
- `app/rodauth/user_rodauth_plugin.rb` - Rodauth configuration
|
59
|
+
- `app/controllers/rodauth_controller.rb` - Base controller for auth pages
|
60
|
+
- Database migrations for users and auth-related tables
|
61
|
+
|
62
|
+
## Creating the Blog Feature Package
|
63
|
+
|
64
|
+
Let's create a dedicated package for our blogging functionality:
|
65
|
+
|
66
|
+
```bash
|
67
|
+
rails generate pu:pkg:package blogging
|
68
|
+
```
|
69
|
+
|
70
|
+
This generates a new feature package under `packages/blogging/` with:
|
71
|
+
- Base controllers
|
72
|
+
- Model and policy base classes
|
73
|
+
- Package-specific views directory
|
74
|
+
- Engine configuration
|
75
|
+
|
76
|
+
## Adding Posts Resource
|
77
|
+
|
78
|
+
Now we can add our first resource - blog posts:
|
79
|
+
|
80
|
+
```bash
|
81
|
+
rails generate pu:res:scaffold post user:belongs_to title:string \
|
82
|
+
content:text 'published_at:datetime?'
|
83
|
+
```
|
84
|
+
|
85
|
+
::: tip
|
86
|
+
Unlike Rails, Plutonium generates fields as non-null by default.
|
87
|
+
Appending `?` to the type e.g. `published_at:datetime?` makes `published_at` a **nullable** datetime.
|
88
|
+
:::
|
89
|
+
|
90
|
+
When prompted, select the `blogging` feature package.
|
91
|
+
|
92
|
+
This creates:
|
93
|
+
- Post model with associations
|
94
|
+
- Policy class with basic permissions
|
95
|
+
- Controllers for CRUD operations
|
96
|
+
- Database migration
|
97
|
+
|
98
|
+
The generated post model includes:
|
99
|
+
```ruby
|
100
|
+
class Blogging::Post < Blogging::ResourceRecord
|
101
|
+
belongs_to :user
|
102
|
+
validates :title, presence: true
|
103
|
+
validates :content, presence: true
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
Remember to apply the new migrations:
|
108
|
+
```bash
|
109
|
+
rails db:migrate
|
110
|
+
```
|
111
|
+
|
112
|
+
## Creating the Dashboard Portal
|
113
|
+
|
114
|
+
Let's add a portal to manage our blog:
|
115
|
+
|
116
|
+
```bash
|
117
|
+
rails generate pu:pkg:portal dashboard
|
118
|
+
```
|
119
|
+
|
120
|
+
When prompted, select `user` for authentication.
|
121
|
+
|
122
|
+
This creates a new portal package under `packages/dashboard_portal/` with:
|
123
|
+
- Portal-specific controllers
|
124
|
+
- Resource presentation layer
|
125
|
+
- Dashboard views
|
126
|
+
- Authenticated routes
|
127
|
+
|
128
|
+
## Configure Routes
|
129
|
+
|
130
|
+
Let's configure our application routes to properly handle authentication and dashboard access:
|
131
|
+
|
132
|
+
::: code-group
|
133
|
+
```ruby [app/rodauth/user_rodauth_plugin.rb]
|
134
|
+
# ==> Redirects
|
135
|
+
|
136
|
+
# Redirect to home after login.
|
137
|
+
create_account_redirect "/" # [!code --]
|
138
|
+
create_account_redirect "/dashboard" # [!code ++]
|
139
|
+
|
140
|
+
# Redirect to home after login.
|
141
|
+
login_redirect "/" # [!code --]
|
142
|
+
login_redirect "/dashboard" # [!code ++]
|
143
|
+
|
144
|
+
# Redirect to home page after logout.
|
145
|
+
logout_redirect "/" # [!code --]
|
146
|
+
logout_redirect "/dashboard" # [!code ++]
|
147
|
+
|
148
|
+
# Redirect to wherever login redirects to after account verification.
|
149
|
+
verify_account_redirect { login_redirect }
|
150
|
+
```
|
151
|
+
|
152
|
+
```ruby [config/routes.rb]
|
153
|
+
Rails.application.routes.draw do
|
154
|
+
# Other routes...
|
155
|
+
|
156
|
+
# Defines the root path route ("/")
|
157
|
+
# root "posts#index" # [!code --]
|
158
|
+
root to: redirect("/dashboard") # [!code ++]
|
159
|
+
end
|
160
|
+
```
|
161
|
+
:::
|
162
|
+
|
163
|
+
These changes ensure that:
|
164
|
+
- Users are directed to the dashboard after signing up
|
165
|
+
- Users are directed to the dashboard after logging in
|
166
|
+
- Users are directed to the dashboard after logging out
|
167
|
+
- The root URL (`/`) redirects to the dashboard
|
168
|
+
- Account verification follows the same flow as login
|
169
|
+
|
170
|
+
## Connecting Posts to Dashboard
|
171
|
+
|
172
|
+
We can now connect our blog posts to the dashboard:
|
173
|
+
|
174
|
+
```bash
|
175
|
+
rails generate pu:res:conn
|
176
|
+
```
|
177
|
+
|
178
|
+
Select:
|
179
|
+
1. Source feature: `blogging`
|
180
|
+
2. Resources: `Blogging::Post`
|
181
|
+
3. Portal: `dashboard_portal`
|
182
|
+
|
183
|
+
This configures the routing and controllers to display posts in the dashboard.
|
184
|
+
|
185
|
+

|
186
|
+
|
187
|
+
## Adding Comments
|
188
|
+
|
189
|
+
Let's add commenting functionality:
|
190
|
+
|
191
|
+
```bash
|
192
|
+
rails generate pu:res:scaffold comment blogging/post:belongs_to \
|
193
|
+
user:belongs_to body:text
|
194
|
+
|
195
|
+
rails db:migrate
|
196
|
+
|
197
|
+
rails generate pu:res:conn
|
198
|
+
```
|
199
|
+
|
200
|
+
::: tip
|
201
|
+
Note the use of the namespaced model in the association `blogging/post`.
|
202
|
+
|
203
|
+
Plutonium has inbuilt support for handling namespaces, generating:
|
204
|
+
```ruby
|
205
|
+
# model
|
206
|
+
belongs_to :post, class_name: "Blogging::Post"
|
207
|
+
|
208
|
+
# migration
|
209
|
+
t.belongs_to :post, null: false, foreign_key: {:to_table=>:blogging_posts}
|
210
|
+
```
|
211
|
+
:::
|
212
|
+
|
213
|
+
This creates:
|
214
|
+
- Comment model with associations
|
215
|
+
- Policy controlling access
|
216
|
+
- CRUD interface in dashboard
|
217
|
+
- Proper routing configuration
|
218
|
+
|
219
|
+
## Customizing the Interface
|
220
|
+
|
221
|
+
### Post Table Customization
|
222
|
+
|
223
|
+
We can customize how posts appear in the table view:
|
224
|
+
|
225
|
+
```ruby
|
226
|
+
# packages/blogging/app/policies/blogging/post_policy.rb
|
227
|
+
def permitted_attributes_for_index
|
228
|
+
[:user, :title, :published_at, :created_at]
|
229
|
+
end
|
230
|
+
```
|
231
|
+
|
232
|
+

|
233
|
+
|
234
|
+
### Post Detail View
|
235
|
+
|
236
|
+
Customize the post detail layout using display grids:
|
237
|
+
|
238
|
+
```ruby
|
239
|
+
# packages/blogging/app/definitions/blogging/post_definition.rb
|
240
|
+
class Blogging::PostDefinition < Blogging::ResourceDefinition
|
241
|
+
display :user, class: "col-span-full"
|
242
|
+
display :title, class: "col-span-full"
|
243
|
+
display :content, class: "col-span-full"
|
244
|
+
display :published_at, class: "col-span-full"
|
245
|
+
end
|
246
|
+
```
|
247
|
+
|
248
|
+

|
249
|
+
|
250
|
+
## Adding Publishing Functionality
|
251
|
+
|
252
|
+
Let's add the ability to publish posts:
|
253
|
+
|
254
|
+
::: code-group
|
255
|
+
|
256
|
+
```ruby [post_definition.rb]
|
257
|
+
# packages/blogging/app/definitions/blogging/post_definition.rb
|
258
|
+
action :publish,
|
259
|
+
interaction: Blogging::Posts::Publish,
|
260
|
+
collection_record_action: false # do not show this on the table
|
261
|
+
```
|
262
|
+
|
263
|
+
```ruby [publish.rb]
|
264
|
+
# packages/blogging/app/interactions/blogging/posts/publish.rb
|
265
|
+
module Blogging
|
266
|
+
module Posts
|
267
|
+
class Publish < ResourceInteraction
|
268
|
+
presents label: "Publish Post", icon: Phlex::TablerIcons::Send
|
269
|
+
attribute :resource
|
270
|
+
|
271
|
+
def execute
|
272
|
+
if resource.update(published_at: Time.current)
|
273
|
+
succeed(resource)
|
274
|
+
.with_message("Post was successfully published")
|
275
|
+
else
|
276
|
+
failed(resource.errors)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
```
|
283
|
+
|
284
|
+
```ruby [post_policy.rb]
|
285
|
+
# packages/blogging/app/policies/blogging/post_policy.rb
|
286
|
+
|
287
|
+
def publish? # [!code ++]
|
288
|
+
!record.published_at # [!code ++]
|
289
|
+
end # [!code ++]
|
290
|
+
|
291
|
+
|
292
|
+
def permitted_attributes_for_create
|
293
|
+
[:user, :title, :content, :published_at] # [!code --]
|
294
|
+
[:user, :title, :content] # [!code ++]
|
295
|
+
end
|
296
|
+
```
|
297
|
+
|
298
|
+
:::
|
299
|
+
|
300
|
+

|
301
|
+
|
302
|
+
## Adding Comments Panel
|
303
|
+
|
304
|
+
Enable viewing comments on posts:
|
305
|
+
|
306
|
+
::: code-group
|
307
|
+
|
308
|
+
```ruby [post.rb]
|
309
|
+
# packages/blogging/app/models/blogging/post.rb
|
310
|
+
has_many :comments
|
311
|
+
```
|
312
|
+
|
313
|
+
```ruby [post_policy.rb]
|
314
|
+
# packages/blogging/app/policies/blogging/post_policy.rb
|
315
|
+
def permitted_associations
|
316
|
+
%i[comments]
|
317
|
+
end
|
318
|
+
```
|
319
|
+
|
320
|
+
:::
|
321
|
+
|
322
|
+

|
323
|
+
|
324
|
+
## Scoping Resources
|
325
|
+
|
326
|
+
Ensure users only see their own content:
|
327
|
+
|
328
|
+
```ruby
|
329
|
+
# packages/dashboard_portal/lib/engine.rb
|
330
|
+
module DashboardPortal
|
331
|
+
class Engine < Rails::Engine
|
332
|
+
include Plutonium::Portal::Engine
|
333
|
+
|
334
|
+
config.after_initialize do
|
335
|
+
scope_to_entity User, strategy: :current_user
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
```
|
340
|
+
|
341
|
+
## Adding Nested Comments
|
342
|
+
|
343
|
+
Enable adding comments directly from the post form:
|
344
|
+
|
345
|
+
::: code-group
|
346
|
+
|
347
|
+
```ruby [post_definition.rb]
|
348
|
+
# packages/blogging/app/definitions/blogging/post_definition.rb
|
349
|
+
nested_input :comments,
|
350
|
+
using: Blogging::CommentDefinition,
|
351
|
+
fields: %i[user body]
|
352
|
+
```
|
353
|
+
|
354
|
+
```ruby [post.rb]
|
355
|
+
# packages/blogging/app/models/blogging/post.rb
|
356
|
+
has_many :comments
|
357
|
+
accepts_nested_attributes_for :comments # [!code ++]
|
358
|
+
```
|
359
|
+
|
360
|
+
```ruby [post_policy.rb]
|
361
|
+
# packages/blogging/app/policies/blogging/post_policy.rb
|
362
|
+
def permitted_attributes_for_create
|
363
|
+
[:user, :title, :content] # [!code --]
|
364
|
+
[:user, :title, :content, :comments] # [!code ++]
|
365
|
+
end
|
366
|
+
```
|
367
|
+
|
368
|
+
:::
|
369
|
+
|
370
|
+

|
371
|
+
|
372
|
+
## Running the Application
|
373
|
+
|
374
|
+
1. Start the Development server:
|
375
|
+
```bash
|
376
|
+
bin/dev
|
377
|
+
```
|
378
|
+
|
379
|
+
2. Visit `http://localhost:3000`
|
380
|
+
|
381
|
+
3. Create a user account and start managing your blog!
|
382
|
+
|
383
|
+
## What's Next?
|
384
|
+
|
385
|
+
Some ideas for extending the application:
|
386
|
+
- Add categories/tags for posts
|
387
|
+
- Implement comment moderation
|
388
|
+
- Add rich text editing for post content
|
389
|
+
- Create a public-facing blog view
|
390
|
+
- Add image attachments for posts
|
391
|
+
- Implement social sharing
|
392
|
+
|
393
|
+
## Conclusion
|
394
|
+
|
395
|
+
In this tutorial, we've built a full-featured blog application with:
|
396
|
+
- User authentication
|
397
|
+
- Post management
|
398
|
+
- Commenting system
|
399
|
+
- Publishing workflow
|
400
|
+
- Proper authorization
|
401
|
+
- User-scoped content
|
402
|
+
|
403
|
+
Plutonium helped us quickly scaffold and connect the pieces while maintaining clean separation of concerns through its package system.
|
data/docs/index.md
CHANGED
@@ -17,27 +17,31 @@ hero:
|
|
17
17
|
link: /guide/what-is-plutonium
|
18
18
|
|
19
19
|
features:
|
20
|
-
|
21
|
-
|
20
|
+
# Core Value Proposition - Start with the main benefit
|
21
|
+
- title: Rich Resource Management
|
22
|
+
details: Beautiful, modern interfaces with production-ready components for rapid development
|
22
23
|
|
23
|
-
-
|
24
|
-
|
24
|
+
# Core Architecture Features - Foundation pieces
|
25
|
+
- title: Built-in Multitenancy
|
26
|
+
details: Row-level multitenancy that works out of the box - perfect for SaaS and enterprise apps
|
25
27
|
|
26
|
-
- title:
|
27
|
-
details:
|
28
|
+
- title: Advanced Authorization
|
29
|
+
details: Comprehensive access control built on Action Policy's proven authorization framework
|
28
30
|
|
29
|
-
- title:
|
30
|
-
details:
|
31
|
+
- title: Seamless Authentication
|
32
|
+
details: Integrate your existing auth or use our Rodauth integration - ready in seconds
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
+
# Developer Experience Features - How it makes development easier
|
35
|
+
- title: Intelligent Fields
|
36
|
+
details: Smart field detection with automatic Rails model mapping and zero configuration needed
|
34
37
|
|
35
38
|
- title: Advanced Nested Resources
|
36
|
-
details: Complex resource relationships made simple
|
39
|
+
details: Complex resource relationships made simple through intelligent relationship mapping
|
37
40
|
|
38
|
-
-
|
39
|
-
|
41
|
+
# Extensibility Features - How it grows with your needs
|
42
|
+
- title: Extensible Workflows
|
43
|
+
details: Add custom actions and business workflows with a simple, declarative API
|
40
44
|
|
41
|
-
- title:
|
42
|
-
details:
|
45
|
+
- title: Flexible UI Customization
|
46
|
+
details: Customize any aspect of your interfaces with elegant builder APIs
|
43
47
|
---
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,12 +1,22 @@
|
|
1
1
|
const { execSync } = require('child_process');
|
2
2
|
const plutoniumGemPath = execSync("bundle show plutonium").toString().trim();
|
3
3
|
const plutoniumTailwindConfig = require(`${plutoniumGemPath}/tailwind.options.js`)
|
4
|
+
const tailwindPlugin = require('tailwindcss/plugin')
|
4
5
|
|
5
6
|
module.exports = {
|
6
7
|
darkMode: plutoniumTailwindConfig.darkMode,
|
7
8
|
plugins: [
|
8
9
|
// add plugins here
|
9
|
-
].concat(plutoniumTailwindConfig.plugins.map((plugin)
|
10
|
+
].concat(plutoniumTailwindConfig.plugins.map(function (plugin) {
|
11
|
+
switch (typeof plugin) {
|
12
|
+
case "function":
|
13
|
+
return tailwindPlugin(plugin)
|
14
|
+
case "string":
|
15
|
+
return require(plugin)
|
16
|
+
default:
|
17
|
+
throw Error(`unsupported plugin: ${plugin}: ${(typeof plugin)}`)
|
18
|
+
}
|
19
|
+
})),
|
10
20
|
theme: plutoniumTailwindConfig.theme,
|
11
21
|
content: [
|
12
22
|
`${__dirname}/app/**/*.rb`,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../lib/plutonium_generators"
|
4
|
+
|
5
|
+
module Pu
|
6
|
+
module Extra
|
7
|
+
class ColorizedLoggerGenerator < Rails::Generators::Base
|
8
|
+
include PlutoniumGenerators::Generator
|
9
|
+
|
10
|
+
source_root File.expand_path("templates", __dir__)
|
11
|
+
|
12
|
+
desc "Set up a colorized logger"
|
13
|
+
|
14
|
+
def start
|
15
|
+
copy_file "config/initializers/colorized_logger.rb"
|
16
|
+
rescue => e
|
17
|
+
exception "#{self.class} failed:", e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/generators/pu/extra/colorized_logger/templates/config/initializers/colorized_logger.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
return unless Rails.env.development?
|
4
|
+
|
5
|
+
# Taken from https://gist.github.com/kyrylo/3d90f7a656d1a0accf244b8f1d25999b?permalink_comment_id=5264120#gistcomment-5264120
|
6
|
+
|
7
|
+
module ColorizedLogger
|
8
|
+
%i[debug info warn error fatal unknown].each do |level|
|
9
|
+
color = case level
|
10
|
+
when :debug then "\e[0;36m" # Cyan text
|
11
|
+
when :info then "\e[0;32m" # Green text
|
12
|
+
when :warn then "\e[1;33m" # Yellow text
|
13
|
+
when :error, :fatal then "\e[1;31m" # Red text
|
14
|
+
else "\e[0m" # Terminal default
|
15
|
+
end
|
16
|
+
|
17
|
+
define_method(level) do |progname = nil, &block|
|
18
|
+
super(color + (progname || (block && block.call)).to_s + "\e[0m")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
Rails.logger.extend(ColorizedLogger)
|
@@ -34,7 +34,7 @@ module Plutonium
|
|
34
34
|
# Gets the resource class for the controller
|
35
35
|
# @return [ActiveRecord::Base] The resource class
|
36
36
|
def resource_class
|
37
|
-
return @resource_class if @resource_class
|
37
|
+
return @resource_class if @resource_class
|
38
38
|
|
39
39
|
name.to_s.gsub(/^#{current_package}::/, "").gsub(/Controller$/, "").classify.constantize
|
40
40
|
rescue NameError
|
@@ -52,7 +52,7 @@ module Plutonium
|
|
52
52
|
# Returns the resource record based on path parameters
|
53
53
|
# @return [ActiveRecord::Base, nil] The resource record
|
54
54
|
def resource_record
|
55
|
-
@resource_record ||= current_authorized_scope.from_path_param(params[:id]).first! if params[:id]
|
55
|
+
@resource_record ||= current_authorized_scope.from_path_param(params[:id]).first! if params[:id]
|
56
56
|
@resource_record
|
57
57
|
end
|
58
58
|
|
@@ -125,19 +125,23 @@ module Plutonium
|
|
125
125
|
# Applies submitted resource params if they have been passed
|
126
126
|
def maybe_apply_submitted_resource_params!
|
127
127
|
ensure_get_request
|
128
|
-
resource_record.attributes = submitted_resource_params if params[resource_param_key]
|
128
|
+
resource_record.attributes = submitted_resource_params if params[resource_param_key]
|
129
129
|
end
|
130
130
|
|
131
131
|
# Returns the current parent based on path parameters
|
132
132
|
# @return [ActiveRecord::Base, nil] The current parent
|
133
133
|
def current_parent
|
134
|
-
return unless parent_route_param
|
134
|
+
return unless parent_route_param
|
135
135
|
|
136
136
|
@current_parent ||= begin
|
137
137
|
parent_route_key = parent_route_param.to_s.gsub(/_id$/, "").to_sym
|
138
138
|
parent_class = current_engine.resource_register.route_key_lookup[parent_route_key]
|
139
|
-
parent_scope =
|
140
|
-
|
139
|
+
parent_scope = if scoped_to_entity?
|
140
|
+
parent_class.associated_with(current_scoped_entity)
|
141
|
+
else
|
142
|
+
parent_class.all
|
143
|
+
end
|
144
|
+
parent_scope = parent_scope.from_path_param(params[parent_route_param])
|
141
145
|
current_parent = parent_scope.first!
|
142
146
|
authorize! current_parent, to: :read?
|
143
147
|
current_parent
|
@@ -153,7 +157,7 @@ module Plutonium
|
|
153
157
|
# Returns the parent input parameter
|
154
158
|
# @return [Symbol, nil] The parent input parameter
|
155
159
|
def parent_input_param
|
156
|
-
return unless current_parent
|
160
|
+
return unless current_parent
|
157
161
|
|
158
162
|
resource_class.reflect_on_all_associations(:belongs_to).find { |assoc| assoc.klass.name == current_parent.class.name }&.name&.to_sym
|
159
163
|
end
|
@@ -182,7 +186,7 @@ module Plutonium
|
|
182
186
|
# Overrides parent parameters
|
183
187
|
# @param [Hash] input_params The input parameters
|
184
188
|
def override_parent_params(input_params)
|
185
|
-
if current_parent
|
189
|
+
if current_parent
|
186
190
|
if input_params.key?(parent_input_param) || resource_class.method_defined?(:"#{parent_input_param}=")
|
187
191
|
input_params[parent_input_param] = current_parent
|
188
192
|
end
|
@@ -112,7 +112,7 @@ module Plutonium
|
|
112
112
|
#
|
113
113
|
# @return [Hash] default context for the current resource's policy
|
114
114
|
def current_policy_context
|
115
|
-
{
|
115
|
+
{entity_scope: current_parent || entity_scope_for_authorize}
|
116
116
|
end
|
117
117
|
|
118
118
|
# Authorizes the current action for the given record of the current resource
|
@@ -130,7 +130,7 @@ module Plutonium
|
|
130
130
|
#
|
131
131
|
# @return [Array<Symbol>] the list of permitted attributes for the current action
|
132
132
|
def permitted_attributes
|
133
|
-
@permitted_attributes ||= current_policy.send_with_report(:"permitted_attributes_for_#{action_name}")
|
133
|
+
@permitted_attributes ||= current_policy.send_with_report(:"permitted_attributes_for_#{action_name}").freeze
|
134
134
|
end
|
135
135
|
|
136
136
|
# Returns the list of permitted associations for the current resource
|