JohnH
JohnH

Reputation: 5

Toggling true/false: editing a file in ruby

I have some code that tries to change 'false' to 'true' in a ruby file, but it only works once while the script is running.

    toggleto = true
    text = File.read(filename)
text.gsub!("#{!toggleto}", "#{toggleto}")
File.open(filename, 'w+') {|file| file.write(text); file.close}

As far as I know, as long as I close a file, i should be able to read it it afterwards with what I previously wrote and thus change it back and forth no matter how many times.

Larger Context:

def toggleAutoAction

  require "#{@require_path}/options"

  filename = "#{@require_path}/options.rb"

  writeToggle(filename, !OPTIONS[:auto])

  0

end


  def writeToggle(filename, toggleto)

text = File.read(filename)
text.gsub!(":auto => #{!toggleto}", ":auto => #{toggleto}")
File.open(filename, 'w+') {|file| file.write(text); file.close}

  end


  def exitOrMenu

    puts "Are you done? (y/n)"
    prompt

    if gets.chomp == 'n'
      whichAction
    else
      exit
    end

  end


  def whichAction
    if action == 5
  toggleAutoAction
    else
      puts "Sorry, that isn't an option...returning"
  return 1
    end

    exitOrMenu

  end

Upvotes: 0

Views: 101

Answers (1)

DMKE
DMKE

Reputation: 4603

The problem lays within this method:

def toggleAutoAction
  require "#{@require_path}/options"         # here
  filename = "#{@require_path}/options.rb"
  writeToggle(filename, !OPTIONS[:auto])
  0
end

Ruby will not load the options.rb a second time (i.e. with the exact same path name), hence your !OPTIONS[:auto] will only be evaluated once (otherwise you would get a constant-already-defined-warning, provided OPTIONS is defined in options.rb). See Kernel#require docs.

You could, of course, do crazy stuff like

eval File.read("#{@require_path}/options.rb")

but I would not recommend that (performance wise).

As noted above, reading/writing from/to YAML files is less painful ;-)

Upvotes: 1

Related Questions