Coder Social home page Coder Social logo

Comments (8)

dblock avatar dblock commented on May 30, 2024

@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.

mbleigh avatar mbleigh commented on May 30, 2024

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.

micahbrich avatar micahbrich commented on May 30, 2024

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.

jch avatar jch commented on May 30, 2024

@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.

micahbrich avatar micahbrich commented on May 30, 2024

Ohhh that's fascinating, I never thought of it like that. Thanks @jch!

from grape.

windmillium avatar windmillium commented on May 30, 2024

@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.

jch avatar jch commented on May 30, 2024

Sandi Metz gave a great conference talk that explains SOLID step by step. The video is available here

from grape.

dblock avatar dblock commented on May 30, 2024

Lets close this since it's a question. Bring it up in the Google Group for followup.

from grape.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.