From e18240d974b36ffdd7aeef2afd3d17c3f67d843a Mon Sep 17 00:00:00 2001 From: Andy Delcambre Date: Mon, 12 May 2008 12:36:51 -0700 Subject: [PATCH] ActionArgs can now eval to false If an action argument eval'd to false (i.e. either def action(foo = nil) or def action(foo = false)) then action args would throw BadRequest if you did not supply an argument for foo in those examples. Lighthouse ticket #97. --- .../lib/merb-action-args/abstract_controller.rb | 7 ++++--- merb-action-args/lib/merb-action-args/get_args.rb | 7 +++---- merb-action-args/spec/action_args_spec.rb | 4 ++++ merb-action-args/spec/controllers/action-args.rb | 4 ++++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/merb-action-args/lib/merb-action-args/abstract_controller.rb b/merb-action-args/lib/merb-action-args/abstract_controller.rb index f941907..a6112dc 100644 --- a/merb-action-args/lib/merb-action-args/abstract_controller.rb +++ b/merb-action-args/lib/merb-action-args/abstract_controller.rb @@ -1,7 +1,7 @@ class Merb::AbstractController class << self - attr_accessor :action_argument_list + attr_accessor :action_argument_list alias_method :old_inherited, :inherited # Stores the argument lists for all methods for this class. @@ -25,10 +25,11 @@ class Merb::AbstractController # ==== Raises # BadRequest:: The params hash doesn't have a required parameter. def _call_action(action) - args = self.class.action_argument_list[action].map do |arg, default| + arguments, defaults = self.class.action_argument_list[action] + args = arguments.map do |arg, default| arg = arg p = params.key?(arg.to_sym) - raise BadRequest unless p || default + raise BadRequest unless p || (defaults && defaults.include?(arg)) p ? params[arg.to_sym] : default end __send__(action, *args) diff --git a/merb-action-args/lib/merb-action-args/get_args.rb b/merb-action-args/lib/merb-action-args/get_args.rb index c0b8e37..f01ea18 100644 --- a/merb-action-args/lib/merb-action-args/get_args.rb +++ b/merb-action-args/lib/merb-action-args/get_args.rb @@ -35,20 +35,19 @@ class ParseTreeArray < Array #:nodoc: # method defined with def keyword args = arg_node.arg_nodes default_node = arg_node.deep_array_node(:block) - return args unless default_node + return [args, []] unless default_node else # assuming method defined with Module#define_method - return [] + return [[],[]] end # if it was defined with def, and we found the default_node, # that should bring us back to regularly scheduled programming.. - lasgns = default_node[1..-1] lasgns.each do |asgn| args.assoc(asgn[1]) << eval(RubyToRuby.new.process(asgn[2])) end - args + [args, (default_node[1..-1].map { |asgn| asgn[1] })] end end diff --git a/merb-action-args/spec/action_args_spec.rb b/merb-action-args/spec/action_args_spec.rb index 0f94108..1e791a2 100644 --- a/merb-action-args/spec/action_args_spec.rb +++ b/merb-action-args/spec/action_args_spec.rb @@ -30,4 +30,8 @@ describe Merb::AbstractController do dispatch_to(ActionArgs, :funky_inherited_method, :foo => "bar", :bar => "baz").body.should == "bar baz" end + it "should be able to handle nil defaults" do + dispatch_to(ActionArgs, :with_default_nil, :foo => "bar").body.should == "bar " + end + end \ No newline at end of file diff --git a/merb-action-args/spec/controllers/action-args.rb b/merb-action-args/spec/controllers/action-args.rb index 77c7a84..f23517e 100644 --- a/merb-action-args/spec/controllers/action-args.rb +++ b/merb-action-args/spec/controllers/action-args.rb @@ -32,4 +32,8 @@ class ActionArgs < Merb::Controller "mos def" end + def with_default_nil(foo, bar = nil) + "#{foo} #{bar}" + end + end \ No newline at end of file -- 1.5.4.5