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

編集:

ここで機能した完全なコード。ゲッターとセッターを含む :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!(それらはエイリアスです)、配列自体を変更しますが、その中のオブジェクトは変更しません。まとめて新しい配列を返しますmapcollect

問題がデータベースに保存されていないことである場合はd.save、そこに a を配置する必要があります。

表示するだけの場合は、ビューで表示するときに値を切り捨てませんか?

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