Pergunta

Is it possible to dynamically create key names of a hash? I'm passing the following hash parameters:

params[:store][:store_mon_open(5i)]
params[:store][:store_mon_closed(5i)]
params[:store][:store_tue_open(5i)]
params[:store][:store_tue_closed(5i)]
.
.
.
params[:store][:store_sun_open(5i)]
params[:store][:store_sun_closed(5i)]

To check if each parameter exists, I'm using two arrays:

days_of_week = [:mon, :tue, ..., :sun]
open_or_closed = [:open, :closed]

But, I can't seem to figure out how to dynamically create the params hash (the second key( with the array. Here's what I have so far:

days_of_week.each do |day_of_week|
  open_or_closed.each do |store_status|
    if !eval("params[:store][:store_#{day_of_week}_#{store_status}(5i)").nil
      [DO SOMETHING]
    end
  end
end

I've tried a bunch of things including the eval method (as listed above) but rails seems to dislike the parentheses around the "5i". Any help is greatly appreciated!

Foi útil?

Solução

You should be able to do

if params[:store]["store_#{day_of_week}_#{store_status}(5i)".to_sym]

Note that you were missing the ? on .nil? and that !object.nil? can be shortened to just object

Outras dicas

Assuming this is a HashWithIndifferentAccess, you should be able to access it via string just as you could with a symbol. Thus:

days_of_week.each do |day_of_week|
  open_or_closed.each do |store_status|
    key = "store_#{day_of_week}_#{store_status}(5i)"
    unless params[:store][key]
      # DO SOMETHING
    end
  end
end

If it's not a HashWithIndifferentAccess then you should just be able to call key.to_sym to turn it into a symbol.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top