Dynamically creating hash key name in Rails 4

2019-06-07 21:25发布

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!

2条回答
聊天终结者
2楼-- · 2019-06-07 21:54

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.

查看更多
走好不送
3楼-- · 2019-06-07 21:55

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

查看更多
登录 后发表回答