Loading up a hash with variables if they are defined

P

Patrick Doyle

[Note: parts of this message were removed to make it a legal post.]

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
 
J

James Coglan

[Note: parts of this message were removed to make it a legal post.]
# 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.



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

Jesús Gabriel y Galán

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.


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

Jesus.
 
P

Patrick Doyle

[Note: parts of this message were removed to make it a legal post.]

# 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.



params = [:prefix, :category_id, :page].inject({}) do |hash, name|
var = instance_variable_get("@#{name}")
hash[name] = var if var
hash
end
Thanks... that's certainly along the lines of what I was searching for.
I'll go read about #instance_variable_get now.

--wpd
 
J

Joel VanderWerf

Patrick said:
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.

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}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,567
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top