我刚开始(希望!)在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
提前致谢。
答案 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