0

我正在遍历一个对象列表并更改一些值。当我将值输出到记录器时,我看到了更改的值,但是当在结果页面上时,更改不会被保存。

这是我的循环:

@dis.each do |d|
  temp = d.notes.inspect

  #Now check the length of the temp variable
  temp.length > 25 ? temp = temp[0,25] :  nil

  d.notes = temp
end

如何更改它以便将 temp 的新值保存在 @dis 对象中?

谢谢!

4

2 回答 2

3

您可以使用 collect! 获得您想要的结果!或地图!就地修改数组:

https://stackoverflow.com/a/5646754/643500

x = %w(hello there world)
x.collect! { |element|
  (element == "hello") ? "hi" : element
}
puts x

编辑:

因此,对于您的代码,它看起来像

@dis.collect! do |d|
  temp = d.notes.inspect

  #Now check the length of the temp variable
  temp.length > 25 ? temp = temp[0,25] : temp = nil

  d.notes = temp
end

编辑:

在这里工作的完整代码。确保你有带有 getter 和 setter 的 :notes。阅读 cattr_accessor、attr_accessor 和 attr_accessible

class TestClass
  @note
  def initialize note
    @note = note
  end
  def get_note
    @note
  end
  def set_note note
    @note = note
  end
end

@dis = Array.new
@dis << TestClass.new("yo yo")
@dis << TestClass.new("1 2 3 4 5 6 7 8 9 10 6 7 8 9 10 6")
@dis << TestClass.new("a b c")

@dis.collect! do |d|
  temp = d.get_note.inspect

  #Now check the length of the temp variable
  d.get_note.inspect.length > 25 ? d.set_note(temp[0,25]) : d.set_note(nil)

end


puts "#{@dis}"
于 2012-04-30T14:59:56.510 回答
1

看起来您正在尝试截断 notes 属性。

这应该足够了:

@dis.each do |d|
  d.notes = d.notes.inspect[0,25]
end

由于赋值,这将改变数组内的对象,但不会改变数组对象本身。map!collect!(它们是别名),将改变数组本身,但不会改变其中的对象。map并将collect一起返回一个新数组。

如果您的问题是它没有保存到数据库中,那么您应该d.save在某个地方放一个。

如果只是为了呈现,为什么不在视图中呈现它们时截断值?

<%= truncate d.notes, :length => 25 %>
于 2012-04-30T15:30:09.503 回答