Dynamically creating hash key name in Rails 4

家住魔仙堡 提交于 2019-12-10 11:44:46

问题


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!


回答1:


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




回答2:


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.



来源:https://stackoverflow.com/questions/21321886/dynamically-creating-hash-key-name-in-rails-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!