On Sunday, July 29, 2012 6:54:50 PM UTC+1, tom_302 wrote:
> Thanks - and good call on the lambda for delaying evaluation of the user_id.
> 
> 
> Unfortunately, I also need the user_id to authenticate with the legacy 
> application in order to load its codebase; I'm defining my ActiveRecord 
> models dynamically from this codebase.
> 
> 
> I've been able to use AR scopes to hide all of the checkin/checkout/version 
> control.  And I can pull the http authentication off any request.  I just 
> wish the controller could evaluate my :before_filter before it evaluates its 
> AR models.
> 
> 
> I'm looking into alternatives, but I'd have to give up the dynamic model 
> definition and loose some flexibility there.  
> 

I really think that anything that depends on class load order is fatally flawed 
(and as I said before, in production mode rails will load your app classes 
before the first request arrives.

> 
> Regarding storing the user_id in a constant, i thought rails doesn't share 
> any information between requests; Isn't it up to the server to keep variable 
> states separate however it loads/shares instances of the rails application?  
> Please explain. 
> 
> 
Rails doesn't enforce anything like this. Controller instances only last the 
length of the corresponding request, so anything set there 'disappears' but 
(except in development mode) classes aren't reloaded between requests : class 
variables, constants etc. are shared across requests, and will obviously 
trigger weird behaviour if you run rails in threadsafe modd

Fred

> 
> On Saturday, July 28, 2012 11:06:27 AM UTC-4, Frederick Cheung wrote:
> 
> On Saturday, July 28, 2012 4:20:36 AM UTC+1, tom_302 wrote:
> 
> 
> 
> 
> NativeException ([from a java method of the legacy application]):
> 
>   config/initializers/myapp.rb:169:in `current_user'
> 
>   config/initializers/myapp.rb:351:in `define_model_scope'
> 
>   config/initializers/myapp.rb:625:in `acts_as_controlled'
> 
>   app/models/document.rb:2:in `Document'
> 
>   app/models/document.rb:1:in `(root)'
> 
>   app/models/document.rb:456:in `load_file'
> 
>   app/controllers/documents_controller.rb:1:in `(root)'
> 
>   app/controllers/documents_controller.rb:456:in `load_file'
> 
> 
> 
> 
> Rendered 
> vendor/bundle/jruby/1.8/bundler/gems/rails-80f6547f5b25/actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.erb
>  (27.0ms)
> 
> Rendered 
> vendor/bundle/jruby/1.8/bundler/gems/rails-80f6547f5b25/actionpack/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb
>  (3.0ms)
> 
> Rendered 
> vendor/bundle/jruby/1.8/bundler/gems/rails-80f6547f5b25/actionpack/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb
>  within rescues/layout (46.0ms)
> 
> 
> 
> 
> One solution would be to short-circuit acts_as_controlled if MGR.user isn't 
> set, store a reference to the model, and finally execute acts_as_controlled 
> on all referenced models at the end of the :before_filter method, but that 
> approach would mean evaluating each model twice.
> 
> 
> 
> 
> Is there a better way to make ApplicationController :before_filter execute 
> before the Document model is evaluated by DocumentController?
> 
> 
> 
> 
> 
> 
> This sounds horribly brittle (and in production mode the whole application is 
> loaded at boot time, so I think you'll have problems too). I think you'd be 
> better off rethinking how your acts_as_controlled method works 
> 
> 
> (for example generate the scopes using lambda so that they can change their 
> conditions at runtime)
> 
> 
>  
> 
> 
> PS:  Also, is it even safe to store the user id in a constant like MGR?  I 
> haven't seen any warnings about it being redefined so far, but I'm not quite 
> sure how rails instances are managed across requests & sessions with JRuby 
> and Tomcat.  
> 
> 
> That depends entirely on what MGR.user= does. That could be implemented in a 
> threadsafe way (eg using Thread.current) or in a thread dangerous way
> 
> 
> Fred

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msg/rubyonrails-talk/-/teVdCdeyJFkJ.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to