focused_controller 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -17,19 +17,25 @@ for discussion.
17
17
 
18
18
  ``` ruby
19
19
  class ApplicationController
20
- include FocusedController::Mixin
20
+ class Action < ApplicationController
21
+ include FocusedController::Mixin
22
+ end
21
23
  end
22
24
 
23
25
  module PostsController
24
- class Index < ApplicationController
26
+ class Action < ApplicationController::Action
27
+ before_filter :authenticate
28
+ end
29
+
30
+ class Index < Action
25
31
  expose(:posts) { Post.recent.limit(5) }
26
32
  end
27
33
 
28
- class New < ApplicationController
34
+ class New < Action
29
35
  expose(:post) { Post.new }
30
36
  end
31
37
 
32
- class Singular < ApplicationController
38
+ class Singular < Action
33
39
  expose(:post) { Post.find params[:id] }
34
40
  before_filter { redirect_to root_path unless post.accessible_to?(current_user) }
35
41
  end
@@ -49,22 +55,19 @@ module PostsController
49
55
  end
50
56
  ```
51
57
 
52
- Some notes:
53
-
54
- * You can include `FocusedController::Mixin` anywhere, so you don't have
55
- to use Focused Controller in every single controller if you don't want
56
- to
57
- * `expose` makes the object returned by the block available in your view
58
- template. It also memoizes the result so the block will only be
59
- executed once.
60
- * It is not necessary to specify `:only` or `:except` on the before
61
- filter, since we declare the filter for exactly the actions we want it
62
- to run on. Rails has many methods which accept action names to limit
63
- what they get applied to - this is basically irrelevant with Focused
64
- Controller due to the increased granularity that having a class for each
65
- action gives us.
66
- * The `#call` method is what gets invoked when the action runs, so put
67
- the 'active ingredients' in here.
58
+ You can include `FocusedController::Mixin` anywhere, so you don't have
59
+ to use Focused Controller in every single controller if you don't want
60
+ to. I find it useful to define `ApplicationController::Action` and
61
+ inherit from that where needed.
62
+
63
+ The `#call` method is what gets invoked when the request is served.
64
+
65
+ The `#expose` declaration defines a method which runs the block and
66
+ memoizes the result. It also makes `post` a helper method so you can
67
+ call it from the view template.
68
+
69
+ The `before_filter` in Singular is inherited by precisely the actions
70
+ that need it, so we don't need to specify `:only` or `:except`.
68
71
 
69
72
  ## Routing ##
70
73
 
@@ -224,7 +227,7 @@ describe UsersController do
224
227
  include FocusedController::RSpecHelper
225
228
 
226
229
  describe UsersController::Create do
227
- test "should create user" do
230
+ it "creates a user" do
228
231
  subject.params = { user: { name: 'Jon' } }
229
232
  expect { subject.call }.to change(User, :count).by(1)
230
233
  response.should redirect_to(user_path(subject.user))
@@ -13,8 +13,13 @@ module FocusedController
13
13
  options = @options.dup
14
14
 
15
15
  if to = to_option
16
- options[:to] = FocusedController::Route.new(to)
17
- options[:action] = FocusedController.action_name # necessary for rails <= 3.1
16
+ options[:to] = FocusedController::Route.new(to)
17
+
18
+ # This causes rails to spit out a bit of extra useful information in the case
19
+ # of a routing error. The :action option is also necessary for the routing to
20
+ # work on Rails <= 3.1.
21
+ options[:action] = FocusedController.action_name
22
+ options[:controller] = to.underscore
18
23
  end
19
24
 
20
25
  options
@@ -1,3 +1,3 @@
1
1
  module FocusedController
2
- VERSION = "0.2.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,19 +1,13 @@
1
1
  module PostsController
2
- class Action < ApplicationController
3
- end
4
-
5
- class Index < Action
2
+ class Index < ApplicationController
6
3
  expose(:posts) { Post.all }
7
4
  end
8
5
 
9
- class Initializer < Action
6
+ class New < ApplicationController
10
7
  expose(:post) { Post.new params[:post] }
11
8
  end
12
9
 
13
- class New < Initializer
14
- end
15
-
16
- class Create < Initializer
10
+ class Create < New
17
11
  def call
18
12
  if post.save
19
13
  redirect_to post, :notice => 'Post was successfully created.'
@@ -23,17 +17,14 @@ module PostsController
23
17
  end
24
18
  end
25
19
 
26
- class Finder < Action
20
+ class Show < ApplicationController
27
21
  expose(:post) { Post.find params[:id] }
28
22
  end
29
23
 
30
- class Show < Finder
31
- end
32
-
33
- class Edit < Finder
24
+ class Edit < Show
34
25
  end
35
26
 
36
- class Update < Finder
27
+ class Update < Edit
37
28
  def call
38
29
  if post.update_attributes(params[:post])
39
30
  redirect_to post, :notice => 'Post was successfully updated.'
@@ -43,7 +34,7 @@ module PostsController
43
34
  end
44
35
  end
45
36
 
46
- class Destroy < Finder
37
+ class Destroy < Edit
47
38
  def call
48
39
  post.destroy
49
40
  redirect_to posts_url
@@ -56,7 +56,8 @@ module FocusedController
56
56
  mappings.each do |(method, path), controller|
57
57
  route = recognize(path, :method => method)
58
58
  route.app.name.must_equal controller
59
- route.defaults[:action].must_equal 'call'
59
+ route.defaults[:action].must_equal FocusedController.action_name
60
+ route.defaults[:controller].must_equal controller.underscore
60
61
  end
61
62
  end
62
63
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: focused_controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-12 00:00:00.000000000 Z
12
+ date: 2012-09-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack