49

Every time I change anything in controller's or in models, I have to restart the server for it to take effect.But that wasn't always the case, it used to work normally before, when I changed anything, but i don't know what happened now ?

My Rails version is 3.2.11

In my development environment file i have set config.cache_classes = false.

Please help..

My development.rb file is as follows

Testapp::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = false

  # Log error messages when you accidentally call methods on nil.
  config.whiny_nils = true

  # Show full error reports and disable caching
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send
  config.action_mailer.raise_delivery_errors = false

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

  # Only use best-standards-support built into browsers
  config.action_dispatch.best_standards_support = :builtin

  # Raise exception on mass assignment protection for Active Record models
  config.active_record.mass_assignment_sanitizer = :strict

  # Log the query plan for queries taking more than this (works
  # with SQLite, MySQL, and PostgreSQL)
  config.active_record.auto_explain_threshold_in_seconds = 0.5

  # Do not compress assets
  config.assets.compress = false

  # Expands the lines which load the assets
  config.assets.debug = true

  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

end
Amit Sharma
  • 3,427
  • 2
  • 15
  • 20
  • Can you double check if you are running in development mode? – Hassan Javeed Aug 16 '13 at 10:19
  • yeah @HassanJaveed is right it should work without giving anything in the environment file. Reloading every time is the default behavior in development mode. – dirtydexter Aug 16 '13 at 10:28
  • are you pushing your project to git periodically? if so, check changes on there - perhaps you accidentally deleted a file or changed something without realizing it... – dax Aug 16 '13 at 10:43
  • 1
    Please post your full environment file, there are other factors that can influence the reloading behavior, like config.threadsafe!. – Martijn Aug 16 '13 at 10:46
  • Thanks for your reply,I have checked it my server is running in development mode. – Amit Sharma Aug 19 '13 at 09:58
  • how are you running the the dev server? `rails s`, under something like pow or passenger? – Doon Aug 19 '13 at 11:49
  • I always start my server with rails s command – Amit Sharma Aug 20 '13 at 07:50
  • 2
    For Vagrant/ virtual box users, there's a bug where if the host clock and guest clock are out of sync, it borks rails' reloader. https://github.com/rails/rails/issues/16678 – Ninjaxor Feb 08 '16 at 20:55
  • For some reason this started happening to me in rails 5. I never saw it in the previous versions - at least concerning changes in controllers, models or views. – Renra Jan 17 '17 at 07:26
  • For docker (and possibly for vagrant and virtualbox as well), you can change `EventedFileUpdateChecker` to `FileUpdateChecker` in `development.rb`. More info at https://stackoverflow.com/a/38239345/198348 – Ehtesh Choudhury Jul 29 '20 at 09:10

5 Answers5

69

I have got the answer..

After adding following line in my config/environments/development.rb file my issue has been resolved.

config.reload_classes_only_on_change = false
MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59
Amit Sharma
  • 3,427
  • 2
  • 15
  • 20
  • Can anybody tell what are the drawbacks of using this? – Balaji Radhakrishnan Feb 03 '17 at 06:52
  • 1
    Rails loads the class on every request. In production you want that to be as fast as possible, so it is common to configure Rails to cache those classes. In development, you don't care that much about speed so it is common to disable that caching mechanism, so every change in the file is taken in the next request. This prevents you for having to restart the server every time you want to test a change. – jfc May 31 '17 at 07:44
  • @BalajiRadhakrishnan When using this I've noticed occasionally activeadmin doesn't load its classes in time for the browser (or something to that effect), resulting in errors like `undefined method 'namespace' for nil:NilClass`. Refreshing the page always fixes it. – AFOC Jan 17 '20 at 00:36
9

start your server using below command in console

rails server -e development

if not started then give your rails version and which sever you use for run rails application.

more Configuration

modify your config/environments/development.rb file to:

config.serve_static_assets = false
MD. Khairul Basar
  • 4,976
  • 14
  • 41
  • 59
jayesh
  • 2,422
  • 7
  • 44
  • 78
  • Thanks for your answer, I have tried above command but it wont work for me. My rails version is 3.2.11 and I use webrick server for my application. – Amit Sharma Aug 20 '13 at 07:45
  • modify your config/environments/development.rb file to: config.serve_static_assets = false – jayesh Aug 20 '13 at 11:46
  • Thanks for your response, the issue is resolved after adding **config.serve_static_assets = false** to my development.rb file. – Amit Sharma Aug 20 '13 at 12:46
  • 1
    The solution worked for me but after an hour the same problem started again – Amit Sharma Aug 20 '13 at 15:30
8

An additional situation where this can come up is in a virtualized environment where the files are being edited on the host operating system, and the guest operating system's file event manager doesn't generate events for file changes.

A solution for this situation is to comment out the following line in config/environments/development.rb:

# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker

Thus giving:

# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker

This forces rails to actually check file modification times instead of expecting to get filesystem events.

lindes
  • 9,854
  • 3
  • 33
  • 45
5

There is a good note for VirtualBox users, posted as comment by user Ninjaxor:

For Vagrant/ virtual box users, there's a bug where if the host clock and guest clock are out of sync, it borks rails' reloader. https://github.com/rails/rails/issues/16678

The file Vagrantfile you find in a directory like this: .../ruby/gems/sass-3.4.22/vendor/listen

There you have to add this:

# Sync time every 5 seconds so code reloads properly
config.vm.provider :virtualbox do |v|
  v.customize ["guestproperty", "set", :id, "--timesync-threshold", 5000]
end

Thanks to user axsuul on GitHub!

Beauty
  • 865
  • 11
  • 14
4

I noticed that setting

config.cache_classes = false 

is what did the trick for me.

rjferguson
  • 603
  • 3
  • 12