在Rails 4中动态创建哈希键名

时间:2014-01-24 00:01:55

标签: ruby-on-rails arrays hash parameters dynamically-generated

是否可以动态创建哈希的键名?我传递了以下哈希参数:

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)]

要检查每个参数是否存在,我使用两个数组:

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

但是,我似乎无法弄清楚如何动态创建params哈希(第二个键(带数组)。这是我到目前为止所拥有的:

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

我尝试了很多东西,包括eval方法(如上所列),但是rails似乎不喜欢围绕“5i”的括号。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

你应该能够做到

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

请注意,您错过了?上的.nil?!object.nil?可以缩短为object

答案 1 :(得分:1)

假设这是一个HashWithIndifferentAccess,您应该能够通过字符串访问它,就像使用符号一样。因此:

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

如果它不是HashWithIndifferentAccess那么您应该只能调用key.to_sym将其转换为符号。