Loading up a hash with variables if they are defined


#1

Is there a cleaner, more Rubyesque way to do this?

Return a hash of the navigation parameters

def nav_params
params = {}

params[:prefix]      = @prefix      if @prefix
params[:category_id] = @category_id if @category_id
params[:page]        = @page        if @page

params

end

I want to load a parameters hash with the contents of some instance
variables, but only if they are defined.

–wpd


#2

end

I want to load a parameters hash with the contents of some instance
variables, but only if they are defined.

params = [:prefix, :category_id, :page].inject({}) do |hash, name|
var = instance_variable_get("@#{name}")
hash[name] = var if var
hash
end


#3

On Tue, Dec 23, 2008 at 11:57 AM, James C.
removed_email_address@domain.invalidwrote:

end
end

Thanks… that’s certainly along the lines of what I was searching for.
I’ll go read about #instance_variable_get now.

–wpd


#4

On Tue, Dec 23, 2008 at 5:51 PM, Patrick D. removed_email_address@domain.invalid
wrote:

params
end

I want to load a parameters hash with the contents of some instance
variables, but only if they are defined.

irb(main):005:0> {:prefix => @prefix, :category_id => @category, :page
=> @page}.reject {|k,v| v.nil?}
=> {:prefix=>“asdasdf”, :category_id=>“cat”}

Jesus.


#5

Patrick D. wrote:

params

end

I want to load a parameters hash with the contents of some instance
variables, but only if they are defined.

Watch out: “only if they are defined” is not the same as “only if they
are not nil or false”. If you want the former, then this might be what
you are looking for:

class C
NAV_VARS = %w{ @prefix @category_id @page }
NAV_VAR_KEYS = NAV_VARS.inject({}) {|h,v| h[v] =
v.delete("@").to_sym; h}

def nav_params
(instance_variables & NAV_VARS).inject({}) do |params,var|
params[NAV_VAR_KEYS[var]] = instance_variable_get(var)
params
end
end
end

c = C.new
c.instance_eval do
@prefix = “foo”
@page = false
end

p c.nav_params # ==> {:prefix=>“foo”, :page=>false}