Comments (8)
@micahbrich: we do the same thing as you - I think it would be great if we could use this model as a mixin.
from grape.
So the reason for the difference is because I think there's actually an important idea in separating your representation from your model, but I'm not one to make other people's decisions for them.
I will likely convert the Entity
code into a module and simply use bare classes with the module included to achieve the separation I want. Stay tuned in the next week or so for this.
from grape.
That's cool, that sounds like the best of both! How come it's good to separate em, is there a lesson I could learn from that? What are the benefits?
So the reason for the difference is because I think there's actually an important in separating your representation from your model, but I'm not one to make other people's decisions for them.
I will likely convert the
Entity
code into a module and simply use bare classes with the module included to achieve the separation I want. Stay tuned in the next week or so for this.
Reply to this email directly or view it on GitHub:
#73 (comment)
from grape.
@micahbrich my argument for keeping them separate is that it's a better separation of concerns. The model is responsible for validating and persisting the data. I see Entities as a representation of a model (similar to a database view, or a rails view). Using your User model as an example, you might want to make multiple different Entities that represent the same User instance in different ways:
# if you are friend, I can see all of your fields
class FriendEntity < Grape::Entity
expose :email, :username, :firstname, :lastname
end
# if you are Foe, I can only see your username
class FoeEntity < Grape::Entity
expose :username
end
Then your model doesn't have to have conditionals sprinkled around to determine what to display. Your API endpoint can be responsible for figuring out which representation to display:
class API < Grape::API
get '/users/:id' do
user = User.find(params[:id])
representation = current_user.friends_with?(user) ? FriendEntity : FoeEntity
present user, :with => represenation
end
end
from grape.
Ohhh that's fascinating, I never thought of it like that. Thanks @jch!
from grape.
@micahbrich This is the S in SOLID, when you mix view logic into your model you give it multiple reasons to change, which leads to skyrocketing complexity, as @jch points out.
http://en.wikipedia.org/wiki/Single_responsibility_principle
from grape.
Sandi Metz gave a great conference talk that explains SOLID step by step. The video is available here
from grape.
Lets close this since it's a question. Bring it up in the Google Group for followup.
from grape.
Related Issues (20)
- Use Rack's HeadersHash instead of {}
- endpoint method_missing vs override inspect HOT 2
- Values Validator => Proc's arity < 2 ? HOT 3
- Rails Edge requires Ruby >= 3.1
- Fix specs for Rack Edge
- Fix `params` warning method redefined
- Better tracking of gems deprecation
- Rack::Lint::Error => a header value must be a String or Array of Strings, but the value of 'content-type' is a NilClass HOT 2
- Recognize_path should account for HTTP method HOT 1
- Grape and Protecting Against Mass Assignment Abuse HOT 8
- Why do you convert PATH_INFO? Is there some RFC? HOT 2
- Add support for exclusive parameter groups (e.g. exactly_one_of) HOT 2
- Drop support rack ~> 1 ? HOT 2
- Replace Appraisals by eval_gemfile ? HOT 3
- DeprecatedConstantProxy without a deprecator is deprecated HOT 1
- Investigation memory allocations HOT 1
- Add a memory usage check
- Dropping builder as dependency ? HOT 1
- Introduce standard gem ? HOT 1
- Random error on grape params HOT 5
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 grape.