effective_resources 0.4.9 → 0.4.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67493a1a7367667c97c119a2f4604a67e66c7d23
4
- data.tar.gz: 9b22dc43ff5b95533a283b2ca3e8524c24ff149b
3
+ metadata.gz: 57a9fea58220e51746d9c8467b84e884a3039049
4
+ data.tar.gz: 3252c3a12d1dbff7591df1f8cbab3d9ea4961ddf
5
5
  SHA512:
6
- metadata.gz: 2198031b19ebf08866385301e3e9b3891a34f0447a1d19caba6dd3cd5b827005b61994294d99a248ff407c3eb561900dd73a74975be274050a0351b21e4dc0fc
7
- data.tar.gz: 4893defdbbbbde5e8d963565258d4bea255a398a44f7af0b957fcb09a5b59d015105bb4505d4b6c9852b73a1331c61bf31c51fbfe4a8b55be93921b21326fb7c
6
+ metadata.gz: e869b9eb37fe264c797927817fb67f30abf8415217e572ac2dd628ac6e15105e4f425f807bca12f690d01c908cc61b2fad5fe3f67eb2178a7c61b0e88486d2b4
7
+ data.tar.gz: cd024f08251b9b0ebcbfa22e7e3671b281bcaa603675c10eea7ca89fc05f90f32eddbae710e68a95277c13da844a2e08384f79b4ad6f936bd029abe1710a4e4a
data/README.md CHANGED
@@ -32,21 +32,31 @@ Add to your contoller:
32
32
  class PostsController < ApplicationController
33
33
  include Effective::CrudController
34
34
 
35
- member_action :something
35
+ # Sets the @page_title in a before_filter
36
+ page_title 'My Posts', only: [:index]
36
37
 
37
- protected
38
+ # All queries and objects will be built with this scope
39
+ resource_scope -> { current_user.posts }
38
40
 
39
- # If it's a Hash of attributes, the controller will call .where(attributes)
40
- # and the attributes will be used to initialize the datatable on index
41
- #
42
- # If it's an ActiveRecord scope, or symbol, we initialize a datatable with {resource_scope: true}
43
- # and leave it as a TODO for the datatable to do the right thin .
44
- def post_scope
45
- {client_id: current_user.client_id}
46
- # Post.where(client_id: current_user.client_id)
47
- # :approved
41
+ # Similar to above, with block syntax
42
+ resource_scope do
43
+ Post.active.where(user: current_user)
48
44
  end
49
45
 
46
+ # When GET request, will render the approve page
47
+ # When POST|PATCH|PUT request, will call @post.approve! and do the right thing
48
+ member_action :approve
49
+
50
+ # When GET request, will render an index page scoped to this method (if it's a scope on the model i.e. Post.approved)
51
+ collection_action :approved
52
+
53
+ # When POST|PATCH|PUT request, will call @post.approve! on each post as per params[:ids]
54
+ # Created with effective_datatables bulk actions in mind
55
+ collection_action :bulk_approve
56
+
57
+ protected
58
+
59
+ # The permitted parameters for this post. Other recognized method names are posts_params and permitted_params
50
60
  def post_params
51
61
  params.require(:post).permit(:id, :title, :body)
52
62
  end
@@ -58,11 +68,13 @@ end
58
68
 
59
69
  Implements the 7 RESTful actions: `index`, `new`, `create`, `show`, `edit`, `update`, `destroy`.
60
70
 
61
- - Loads an appropriate `@post` type instance
71
+ - Loads an appropriate `@posts` or `@post` type instance variable.
62
72
  - Sets a `@page_title` (effective_pages).
63
73
  - Calls authorize as per the configured `EffectiveResources.authorization_method` (flow through to CanCan or Pundit)
64
74
  - Does the create/update save
65
75
  - Sets a `flash[:success]` and redirects on success, or sets a `flash.now[:danger]` and renders on error.
76
+ - Does the right thing with member and collection actions
77
+ - Intelligently redirects based on commit message
66
78
 
67
79
  ## Helpers
68
80
 
@@ -101,10 +101,10 @@ module Effective
101
101
  resource.created_by ||= current_user if resource.respond_to?(:created_by=)
102
102
 
103
103
  if resource.save
104
- flash[:success] = "Successfully created #{resource_human_name}"
104
+ flash[:success] = flash_success(resource)
105
105
  redirect_to(resource_redirect_path)
106
106
  else
107
- flash.now[:danger] = "Unable to create #{resource_human_name}: #{resource.errors.full_messages.to_sentence}"
107
+ flash.now[:danger] = flash_danger(resource)
108
108
  render :new
109
109
  end
110
110
  end
@@ -130,10 +130,10 @@ module Effective
130
130
  EffectiveResources.authorized?(self, :update, resource)
131
131
 
132
132
  if resource.update_attributes(send(resource_params_method_name))
133
- flash[:success] = "Successfully updated #{resource_human_name}"
133
+ flash[:success] = flash_success(resource)
134
134
  redirect_to(resource_redirect_path)
135
135
  else
136
- flash.now[:danger] = "Unable to update #{resource_human_name}: #{resource.errors.full_messages.to_sentence}"
136
+ flash.now[:danger] = flash_danger(resource)
137
137
  render :edit
138
138
  end
139
139
  end
@@ -145,9 +145,9 @@ module Effective
145
145
  EffectiveResources.authorized?(self, :destroy, resource)
146
146
 
147
147
  if resource.destroy
148
- flash[:success] = "Successfully deleted #{resource_human_name}"
148
+ flash[:success] = flash_success(resource, :delete)
149
149
  else
150
- flash[:danger] = "Unable to delete #{resource_human_name}: #{resource.errors.full_messages.to_sentence}"
150
+ flash[:danger] = flash_danger(resource, :delete)
151
151
  end
152
152
 
153
153
  if request.referer.present? && !request.referer.include?(effective_resource.show_path)
@@ -164,10 +164,10 @@ module Effective
164
164
  begin
165
165
  resource.public_send("#{action}!") || raise("failed to #{action} #{resource}")
166
166
 
167
- flash[:success] = "Successfully #{action_verb(action)} #{resource_human_name}"
167
+ flash[:success] = flash_success(resource, action)
168
168
  redirect_back(fallback_location: resource_redirect_path)
169
169
  rescue => e
170
- flash.now[:danger] = "Unable to #{action} #{resource_human_name}: #{resource.errors.full_messages.to_sentence.presence || e.message}"
170
+ flash.now[:danger] = flash_danger(resource, action, e: e)
171
171
 
172
172
  referer = request.referer.to_s
173
173
 
@@ -0,0 +1,47 @@
1
+ module Effective
2
+ module FlashMessages
3
+ extend ActiveSupport::Concern
4
+
5
+ # flash[:success] = flash_success(@post)
6
+ def flash_success(resource, action = nil, name: nil)
7
+ raise 'expected an ActiveRecord resource' unless (name || resource.class.respond_to?(:model_name))
8
+
9
+ action ||= :save
10
+ name ||= resource.class.model_name.human
11
+
12
+ "#{name.to_s.titleize} was successfully #{action}#{(action.to_s.end_with?('e') ? 'd' : 'ed')}"
13
+ end
14
+
15
+ # flash.now[:danger] = flash_danger(@post)
16
+ def flash_danger(resource, action = nil, e: nil, name: nil)
17
+ raise 'expected an ActiveRecord resource' unless resource.respond_to?(:errors) && (name || resource.class.respond_to?(:model_name))
18
+
19
+ action ||= resource.respond_to?(:new_record?) ? (resource.new_record? ? :create : :update) : :save
20
+ name ||= resource.class.model_name.human
21
+ messages = flash_errors(resource, e: e)
22
+
23
+ ["Unable to #{action} #{name.to_s.downcase}", (": #{messages}." if messages)].compact.join.html_safe
24
+ end
25
+
26
+ # flash.now[:danger] = "Unable to accept: #{flash_errors(@post)}"
27
+ def flash_errors(resource, e: nil)
28
+ raise 'expected an ActiveRecord resource' unless resource.respond_to?(:errors)
29
+
30
+ messages = resource.errors.map do |attribute, message|
31
+ if message[0] == message[0].upcase # If the error begins with a capital letter
32
+ message
33
+ elsif attribute == :base
34
+ "#{resource.class.model_name.human.downcase} #{message}"
35
+ elsif attribute.to_s.end_with?('_ids')
36
+ "#{resource.class.human_attribute_name(attribute.to_s[0..-5].pluralize).downcase} #{message}"
37
+ else
38
+ "#{resource.class.human_attribute_name(attribute).downcase} #{message}"
39
+ end
40
+ end
41
+
42
+ messages << e.message if messages.blank? && e && e.respond_to?(:message)
43
+
44
+ messages.to_sentence.presence
45
+ end
46
+ end
47
+ end
@@ -15,7 +15,7 @@ module EffectiveResourcesHelper
15
15
 
16
16
  def simple_form_save(form, options = {class: 'form-actions'}, &block)
17
17
  content_tag(:div, class: options[:class]) do
18
- form.button(:submit, 'Save', data: { disable_with: 'Saving...' }) + (capture(&:block) if block_given?)
18
+ form.button(:submit, 'Save', data: { disable_with: 'Saving...' }) + (capture(&block) if block_given?)
19
19
  end
20
20
  end
21
21
 
@@ -23,7 +23,7 @@ module Effective
23
23
  controller_routes.map { |route| route.defaults[:action] if is_get_member?(route) }.compact - crud_actions
24
24
  end
25
25
 
26
- # GET actions
26
+ # POST/PUT/PATCH actions
27
27
  def member_post_actions
28
28
  controller_routes.map { |route| route.defaults[:action] if is_post_member?(route) }.compact - crud_actions
29
29
  end
@@ -9,5 +9,12 @@ module EffectiveResources
9
9
  eval File.read("#{config.root}/config/effective_resources.rb")
10
10
  end
11
11
 
12
+ # Register the flash_messages concern so that it can be called in ActionController
13
+ initializer 'effective_resources.action_controller' do |app|
14
+ ActiveSupport.on_load :action_controller do
15
+ include(Effective::FlashMessages)
16
+ end
17
+ end
18
+
12
19
  end
13
20
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '0.4.9'.freeze
2
+ VERSION = '0.4.10'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.9
4
+ version: 0.4.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-02 00:00:00.000000000 Z
11
+ date: 2017-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -36,6 +36,7 @@ files:
36
36
  - app/assets/javascripts/effective_resources.js
37
37
  - app/assets/javascripts/effective_resources/effective_ujs.js
38
38
  - app/controllers/concerns/effective/crud_controller.rb
39
+ - app/controllers/concerns/effective/flash_messages.rb
39
40
  - app/helpers/effective_resources_helper.rb
40
41
  - app/models/effective/access_denied.rb
41
42
  - app/models/effective/attribute.rb