使用结构初始化哈希数组

时间:2015-04-02 22:53:03

标签: ruby arrays ruby-on-rails-3 hash

我收到的参数数组[config ['events']]如下所示:

 [{"event"=>"loaded", "tags"=>["videjbajc_jbad"]}, {"event"=>"clicked"}, 
 {"event"=>"downloaded"}, {"url"=>"http://aintnothingbutarailsthing"}....}]

我正在尝试对每个哈希键运行验证,这应该是动态的,因为输入可能会改变,哈希键名保持不变。

第一步 - 调用事件方法来映射每个哈希数组:

   def valid?
        @errors = []
        @errors << 'Please check events unless self.events.all?(&:valid?)
        @errors.empty?
   end

第二步 - 将地图运行到我的Events类

   def events
         @events ||= (config['events'] || []).map { |e| Event.create(e) }
   end

最后一步 - 接收数据数组对象并继续初始化和验证

  class Event < Struct.new(
                        :event,
                        :link_type,
                        :url,
                        :media_id,
                        ....  
                      )

   def self.create(data)
      self.new(     
            data['event'],
            data['link_type'],
            data['url'],
            data['media_id'],
            ...
          )
     end

      validates :event, :presence => true
      validates :url, :allow_nil => true, :format => /https:/
      .. and so on and so forth.. :-)
 end

问题:不确定我在这里做错了什么。我只能初始化事件键。在self.create(数据)#{data.inspect}之后加注

       {"event"=>"loaded", "tags"=>["amex_video_q3_delivered"]}

:事件将验证好,但标签不会和其他一切......: - (

请告知: - )

1 个答案:

答案 0 :(得分:1)

我明白了。当传递我的参数数组时,我必须考虑每个可能的键值对条件。

我像这样初始化它:

            data['event'],
            data['tags'] ? data['tags'] : nil,
            data['link_type'],
            data['url'],
            data['media_id'],
            data['ad_placement'] ? data['ad_placement'] : nil,
            data['points'] ? data['points'].to_i : nil,
            data['award'] ? data['award'] : nil,               
            data['points_tag'] ? data ['points_tag'] : nil,
            data['track'] ? data['track'] : nil,
            data['checkin_completed_ttl'] ? data['checkin_completed_ttl'] : nil

确保某些键的值为零。