josevalim-inherited_resources 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ # Version 0.2.0
2
+
3
+ * Added support success/failure blocks.
4
+ * Eager loading of files to work properly in multithreaded environments.
5
+
6
+ # Version 0.1.2
7
+
8
+ * Added more helper_methods.
9
+
1
10
  # Version 0.1.1
2
11
 
3
12
  * Added Rails 2.3.0 and changed tests to work with ActionController::TestCase.
data/README CHANGED
@@ -1,6 +1,6 @@
1
1
  Inherited Resources
2
2
  License: MIT
3
- Version: 0.1.1
3
+ Version: 0.2.0
4
4
 
5
5
  You can also read this README in pretty html at the GitHub project Wiki page:
6
6
 
@@ -141,8 +141,9 @@ twin brother: begin_of_association_chain.
141
141
  It's mostly used when you want to create resources based on the @current_user.
142
142
  In such cases, you don't have your @current_user in the url, but in the session.
143
143
 
144
- So if you have to do: @current_user.projects.find or @current_user.projects.build
145
- you can deal with both just doing:
144
+ This is usually when you have urls like "account/projects" and you have to do
145
+ @current_user.projects.find or @current_user.projects.build in your actions.
146
+ You can deal with it just doing:
146
147
 
147
148
  class ProjectsController < InheritedResources::Base
148
149
  protected
@@ -195,6 +196,39 @@ Yeap, that simple! The nice part is since you already set the instance variable
195
196
  @project, it will not do it again and overwrite your @project with something
196
197
  special. :)
197
198
 
199
+ Before we finish this topic, we should talk about one more thing: "success/failure
200
+ blocks". Let's suppose that when we update our project, in case of failure, we
201
+ want to redirect to the project url instead of re-rendering the edit template.
202
+
203
+ Our first attempt to do this would be:
204
+
205
+ class ProjectsController < InheritedResources::Base
206
+ def update
207
+ update! do |format|
208
+ unless @project.errors.empty? # failure
209
+ format.html { redirect_to project_url(@project) }
210
+ end
211
+ end
212
+ end
213
+ end
214
+
215
+ Looks to verbose, right? (Maybe it reminds you of something! :P)
216
+ But this is Ruby and we can actually do:
217
+
218
+ class ProjectsController < InheritedResources::Base
219
+ def update
220
+ update! do |success, failure|
221
+ failure.html { redirect_to project_url(@project) }
222
+ end
223
+ end
224
+ end
225
+
226
+ Much better! So explaning everything: when you give a block which expects one
227
+ argument it will be executed in both scenarios: success and failure. But If you
228
+ give a block that expects two arguments, the first will be executed only in
229
+ success scenarios and the second in failure scenarios. You keep everything
230
+ clean and organized inside the same action.
231
+
198
232
  Flash messages and I18n
199
233
  -----------------------
200
234
 
@@ -157,7 +157,18 @@
157
157
  #
158
158
  # Further customizations can be done replacing some methods. Check
159
159
  # base_helpers.rb file for more information.
160
- #
160
+
161
+ # Let's require all needed files here. We are still on time to eager load
162
+ # everything on multithreaded environments.
163
+ require File.dirname(__FILE__) + '/base_helpers.rb'
164
+ require File.dirname(__FILE__) + '/belongs_to.rb'
165
+ require File.dirname(__FILE__) + '/belongs_to_helpers.rb'
166
+ require File.dirname(__FILE__) + '/class_methods.rb'
167
+ require File.dirname(__FILE__) + '/dumb_responder.rb'
168
+ require File.dirname(__FILE__) + '/polymorphic_helpers.rb'
169
+ require File.dirname(__FILE__) + '/singleton_helpers.rb'
170
+ require File.dirname(__FILE__) + '/url_helpers.rb'
171
+
161
172
  module InheritedResources
162
173
  RESOURCES_ACTIONS = [ :index, :show, :new, :edit, :create, :update, :destroy ]
163
174
 
@@ -217,14 +228,14 @@ module InheritedResources
217
228
  set_flash_message!(:notice, '{{resource}} was successfully created.')
218
229
 
219
230
  respond_to(:with => object, :status => :created, :location => resource_url) do |format|
220
- yield(format) if block_given?
231
+ block.call args_for_block(block, format, true) if block_given?
221
232
  format.html { redirect_to(resource_url) }
222
233
  end
223
234
  else
224
235
  set_flash_message!(:error)
225
236
 
226
237
  respond_to(:with => object.errors, :status => :unprocessable_entity) do |format|
227
- yield(format) if block_given?
238
+ block.call args_for_block(block, format, false) if block_given?
228
239
  format.html { render :action => "new" }
229
240
  end
230
241
  end
@@ -239,7 +250,7 @@ module InheritedResources
239
250
  set_flash_message!(:notice, '{{resource}} was successfully updated.')
240
251
 
241
252
  respond_to do |format|
242
- yield(format) if block_given?
253
+ block.call args_for_block(block, format, true) if block_given?
243
254
  format.html { redirect_to(resource_url) }
244
255
  format.all { head :ok }
245
256
  end
@@ -247,7 +258,7 @@ module InheritedResources
247
258
  set_flash_message!(:error)
248
259
 
249
260
  respond_to(:with => object.errors, :status => :unprocessable_entity) do |format|
250
- yield(format) if block_given?
261
+ block.call args_for_block(block, format, false) if block_given?
251
262
  format.html { render :action => "edit" }
252
263
  end
253
264
  end
@@ -255,7 +266,7 @@ module InheritedResources
255
266
  alias :update! :update
256
267
 
257
268
  # DELETE /resources/1
258
- def destroy(&block)
269
+ def destroy
259
270
  resource.destroy
260
271
 
261
272
  set_flash_message!(:notice, '{{resource}} was successfully destroyed.')
@@ -195,5 +195,26 @@ module InheritedResources #:nodoc:
195
195
  { }
196
196
  end
197
197
 
198
+ # Used to allow to specify success and failure within just one block:
199
+ #
200
+ # def create
201
+ # create! do |success, failure|
202
+ # failure.html { redirect_to root_url }
203
+ # end
204
+ # end
205
+ #
206
+ def args_for_block(block_to_check_args, format, success = true)
207
+ if block_to_check_args.arity == 2
208
+ dumb_responder = InheritedResources::DumbResponder.new
209
+ if success
210
+ return format, dumb_responder
211
+ else
212
+ return dumb_responder, format
213
+ end
214
+ else
215
+ return format
216
+ end
217
+ end
218
+
198
219
  end
199
220
  end
@@ -0,0 +1,19 @@
1
+ # = Dumb Responder
2
+ #
3
+ # This responder discards all messages sent to him.
4
+ #
5
+ module InheritedResources #:nodoc:
6
+ class DumbResponder #:nodoc:
7
+
8
+ instance_methods.each do |m|
9
+ undef_method m unless m =~ /^__/
10
+ end
11
+
12
+ # This is like a good husband, he will just listen everything that his wife
13
+ # says (which is a lot) without complaining. :)
14
+ def method_missing(*args)
15
+ return true
16
+ end
17
+
18
+ end
19
+ end
data/test/aliases_test.rb CHANGED
@@ -2,7 +2,9 @@
2
2
  # methods works properly.
3
3
  require File.dirname(__FILE__) + '/test_helper'
4
4
 
5
- class Student; end
5
+ class Student;
6
+ def self.human_name; 'Student'; end
7
+ end
6
8
 
7
9
  class StudentsController < InheritedResources::Base
8
10
 
@@ -17,6 +19,25 @@ class StudentsController < InheritedResources::Base
17
19
  new!
18
20
  end
19
21
 
22
+ def create
23
+ create! do |success, failure|
24
+ success.html { render :text => "I won't redirect!" }
25
+ end
26
+ end
27
+
28
+ def update
29
+ update! do |success, failure|
30
+ success.html { redirect_to(resource_url) }
31
+ failure.html { render :text => "I won't render!" }
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ destroy! do |format|
37
+ format.html { render :text => "Destroyed!" }
38
+ end
39
+ end
40
+
20
41
  end
21
42
 
22
43
  class AliasesBaseTest < TEST_CLASS
@@ -41,7 +62,7 @@ class AliasesBaseTest < TEST_CLASS
41
62
  assert_equal 'New HTML', @response.body.strip
42
63
  end
43
64
 
44
- def test_expose_the_resquested_user
65
+ def test_expose_the_resquested_user_on_edit
45
66
  Student.expects(:find).with('42').returns(mock_student)
46
67
  get :edit, :id => '42'
47
68
  assert_equal mock_student, assigns(:student)
@@ -63,6 +84,42 @@ class AliasesBaseTest < TEST_CLASS
63
84
  assert_equal 'Render XML', @response.body
64
85
  end
65
86
 
87
+ def test_is_not_redirected_on_create_with_success_if_success_block_is_given
88
+ Student.stubs(:new).returns(mock_student(:save => true))
89
+ @controller.stubs(:resource_url).returns('http://test.host/')
90
+ post :create
91
+ assert_response :success
92
+ assert_equal "I won't redirect!", @response.body
93
+ end
94
+
95
+ def test_dumb_responder_with_quietly_receive_everything_on_failure
96
+ Student.stubs(:new).returns(mock_student(:save => false, :errors => []))
97
+ @controller.stubs(:resource_url).returns('http://test.host/')
98
+ post :create
99
+ assert_response :success
100
+ assert_template :edit
101
+ end
102
+
103
+ def test_wont_render_edit_template_on_update_with_failure_if_failure_block_is_given
104
+ Student.stubs(:find).returns(mock_student(:update_attributes => false, :errors => []))
105
+ put :update
106
+ assert_response :success
107
+ assert_equal "I won't render!", @response.body
108
+ end
109
+
110
+ def test_dumb_responder_with_quietly_receive_everything_on_success
111
+ Student.stubs(:find).returns(mock_student(:update_attributes => true))
112
+ put :update, :id => '42', :student => {:these => 'params'}
113
+ assert_equal mock_student, assigns(:student)
114
+ end
115
+
116
+ def test_block_is_called_when_student_is_destroyed
117
+ Student.stubs(:find).returns(mock_student(:destroy => true))
118
+ delete :destroy
119
+ assert_response :success
120
+ assert_equal "Destroyed!", @response.body
121
+ end
122
+
66
123
  protected
67
124
  def mock_student(stubs={})
68
125
  @mock_student ||= mock(stubs)
data/test/test_helper.rb CHANGED
@@ -26,13 +26,6 @@ require File.dirname(__FILE__) + '/../lib/inherited_resources/respond_to.rb'
26
26
  class ApplicationController < ActionController::Base; end
27
27
 
28
28
  # Load InheritedResources::Base after defining ApplicationController
29
- require File.dirname(__FILE__) + '/../lib/inherited_resources/base_helpers.rb'
30
- require File.dirname(__FILE__) + '/../lib/inherited_resources/belongs_to.rb'
31
- require File.dirname(__FILE__) + '/../lib/inherited_resources/belongs_to_helpers.rb'
32
- require File.dirname(__FILE__) + '/../lib/inherited_resources/class_methods.rb'
33
- require File.dirname(__FILE__) + '/../lib/inherited_resources/polymorphic_helpers.rb'
34
- require File.dirname(__FILE__) + '/../lib/inherited_resources/singleton_helpers.rb'
35
- require File.dirname(__FILE__) + '/../lib/inherited_resources/url_helpers.rb'
36
29
  require File.dirname(__FILE__) + '/../lib/inherited_resources/base.rb'
37
30
 
38
31
  # Define view_paths
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: josevalim-inherited_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Jos\xC3\xA9 Valim"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-04 00:00:00 -08:00
12
+ date: 2009-02-06 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -33,6 +33,7 @@ files:
33
33
  - lib/inherited_resources/belongs_to.rb
34
34
  - lib/inherited_resources/belongs_to_helpers.rb
35
35
  - lib/inherited_resources/class_methods.rb
36
+ - lib/inherited_resources/dumb_responder.rb
36
37
  - lib/inherited_resources/polymorphic_helpers.rb
37
38
  - lib/inherited_resources/respond_to.rb
38
39
  - lib/inherited_resources/singleton_helpers.rb