试图将哈希的结果推送到数组 - Ruby on rails

时间:2011-10-07 12:06:07

标签: ruby-on-rails ruby arrays hash

我刚开始(希望!)在rails上学习编程/ ruby​​并尝试使用以下方法将哈希的结果推送到数组:

的ApplicationController:

def css_class
  css = Array.new
  product =  {@product.oil => ' oil', @product.pressure_meters => ' pressure_meters', @product.commercial => 'commercial'}
  product.each do |key, value| 
    if key == true
       css.push(value)
    end
  end
  сss.join
end

这在ProductsController中:

def create
  @product = Product.new(params[:product])
  @product.css_class = css_class

  respond_to do |format|
    if @product.save
      format.html { redirect_to @product, notice: 'Product was successfully created.' }
      format.json { render json: @product, status: :created, location: @product }
    else
      format.html { render action: "new" }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end
end

这似乎只是保存了推送到数组的最后一件事,我尝试了下面的代码就可以了,它似乎有效,所以我对我出错的地方感到困惑?

def css_class
  css = Array.new
  product =  {1 => ' pressure_meters', 2 => ' oil'}
  product.each do |key, value| 
    if key > 0
      css.push(value)
     end
  end
  css.join
end

puts css_class

提前致谢。

3 个答案:

答案 0 :(得分:2)

在Ruby Hash中不能有重复键

def css_class
  css = Array.new
  product = { @product.oil => ' oil', 
              @product.pressure_meters => ' pressure_meters', 
              @product.commercial => 'commercial' }
  product.each do |key, value| 
    if key == true
      css.push(value)
    end
  end
  сss.join
end

无效,因为

irb(main):0> h = { true => 'foo', true => 'bar', false=>'foo', false => 'bar' }
=> {true=>"bar", false=>"bar"}

你的第二个例子只是因为你有不同的密钥(1,2)所以让我们稍微重构你的代码

def css_class
  css = ""
  product = { ' oil' => @product.oil, 
              ' pressure_meters' => @product.pressure_meters, 
              ' commercial' => @product.commercial }
  product.each do |key, value| 
    css << key  if value
  end

  сss.strip
end

它可以更简化,但以前的版本也可以正常工作

def css_class
  [ "oil ", "pressure_meters ", "commercial " ].inject(""){ |sum, val| sum += val if @product.send( val.strip ) }.strip
end

答案 1 :(得分:1)

您可以使用Hash#values获取哈希值的数组。

所以:

product_values = product.values

有条件地,你可以使用select选择你想要的那些,如下所示:

product_values = product.select {|k,v| k == true }.values

以下是详细信息:

product_values = product.select {|k,v| k }.values

答案 2 :(得分:0)

感谢您指点我正确的方向。我一直在用你的代码Bohdan得到一个500内部服务器错误,不知道为什么,但玩了它并最终发现这个工作:

def css_class
css = Array.new
   product = { ' oil' => @product.oil, 
            ' pressure_meters' => @product.pressure_meters, 
            ' commercial' => @product.commercial }
   product.each do |key, value| 
  css << key  if value 
end

  css.join
end