Comments (9)
Fixing this would require using Thread locals or some other similar ugly hack. So I'm going to say this is outside the scope of the library.
from pundit.
@jnicklas Yes, when you want to use it with jruby or rubinius, then you have to use some thing like this:
module Pundit
class NotAuthorizedError < StandardError; end
class NotDefinedError < StandardError; end
extend ActiveSupport::Concern
THREAD_KEY_NAME = '_pundit_policy_authorized'
class << self
def policy_authorized?
!! Thread.current[THREAD_KEY_NAME]
end
def policy_authorized=(new_value)
Thread.current[THREAD_KEY_NAME] =new_value
end
def reset_policy_authorized
policy_authorized = false
end
end
from pundit.
@slowjack2k this has nothing to do with which Ruby implementation you use. Provided you use a threaded server (like Puma), this is a problem in MRI too. And thread locals really aren't a sensible solution for this, IMO.
from pundit.
@jnicklas It depends on the Ruby implementation. MRI has still a global interpreder lock.
Even with puma only one thread can run other thread's can only do IO. Changing class level instance variables is save as long as you don't use jruby or rubinius.
from pundit.
No, it's not.You don't have thread safe code per se when using MRI.
from pundit.
@tbuehlmann Ok, you'r right when you do IO a context switches can happen.
from pundit.
@slowjack2k no, that's incorrect. You misunderstand what the GIL does. Context switches can and do happen at any point in time, even with a GIL. Look up the difference between concurrent and parallel. MRI never executes Threads in parallel, but it definitely does execute them concurrently.
from pundit.
(should have said almost never, IIRC there are a few rare cases where MRI actually does execute multiple threads in parallel)
from pundit.
http://www.rubyinside.com/does-the-gil-make-your-ruby-code-thread-safe-6051.html is a good read.
from pundit.
Related Issues (20)
- [Request] Generate policy file when using scaffolding HOT 3
- Readme: update_attributes is deprecated
- policy_class and policy usage HOT 2
- Add `policy_class` parameter to `permitted_attributes` function HOT 3
- Manually specifying policy class via an instance method does not always work HOT 1
- Singular model class name vs. Plural module name HOT 3
- Split this into two methods?
- [Request] policy_scope should not alter joined table structure HOT 2
- Policy Finder `find` does not strip namespace. HOT 2
- Support authorization error flash messages when using turbo frames and streams? HOT 6
- Git tag for v2.3.0? HOT 1
- generator fails with ruby 3.2.0 HOT 6
- "include Pundit::Authorization" undefined ? HOT 3
- Enable custom description for permit matcher
- Do not use NotImplementedError HOT 1
- Rubygems version fully support Ruby 3.2
- Hook into Rails generators (scaffold, model) to generate policy classes HOT 3
- Helper policy_scope does not accept policy_scope_class HOT 1
- README for headless section is incorrect? HOT 1
- uninitialized constant Pundit::Authorization HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pundit.