From: Stefano Crocco Date: 2009-12-10T20:58:18+09:00 Subject: Re: How do I ensure that File.write finished? On Thursday 10 December 2009, Emil Kampp wrote: > |Hi there. > | > |I am trying to make a form to update the values in a yml file (my > |applications configuration file). This is working kind of fine. > |Sometimes it works, sometimes not. > | > |I have confirmed (through logging) that a content for +string+ is always > |there. So there is always something trying to be written into the yml > |file, but still sometimes it ends up being empty. And an empty > |configuration file is no good! > | > |[code] > |# server-controller (user generated controller in rails) > | def update > | # This inserts a new setting into the hash > | unless params[:new_setting][:key].blank? and > |params[:new_setting][:value].blank? > | params[:settings].collect{ |env, settings| > |settings[params[:new_setting][:key].to_sym] = > |params[:new_setting][:value].to_s } > | end > | > | # This writes the hash to the file (See the second snippet for > |details) > | ServerSystem::update_configuration(params[:settings]) > | > | # Redirects to the action that restarts the server to load the new > |configurations > | redirect_to admin_server_restart_path > | end > |[/code] > | > |[code] > |# Custom class > | def update_configuration(settings) > | string = settings.to_yaml > | File.new(APP_CONFIG_FILE, "w").write string > | end > |[/code] > | > |The problem is that the setup is dodgy, sometimes it works, sometimes it > |looks like the server is restarted before the content of +string+ is > |written to the configuration file. > |How can I ensure that the content has been written before executing next > |line of code (the restart in this case)? > | I'm not sure, but maybe the fact you're not closing the file after writing has something to do with that. Try replacing the last line of update_configuration with: File.open(APP_CONFIG_FILE, 'w'){|f| f.write string} When given a block, File.open closes the file after calling the block, which should ensure that everything you wrote to file should have actually been written. I hope this helps Stefano