Ruby on Rails - fat model skinny controller in ruby on rails- ruby on rails tutorial - rails guides - rails tutorial - ruby rails
- “Fat Model, Skinny Controller” refers to how the M and C parts of MVC ideally work together.
- Namely, any non-response-related logic should go in the model, ideally in a nice, testable method.
- While, the “skinny” controller is simply a nice interface between the view and model.
- This can require a range of different types of refactoring, but it all comes down to one idea: by moving any logic that isn’t about the response to the model (instead of the controller), not only have you promoted reuse where possible but we’ve also made it possible to test our code outside of the context of a request.
Example
def index
@published_posts = Post.where('published_at <= ?', Time.now)
@unpublished_posts = Post.where('published_at IS NULL OR published_at > ?', Time.now)
end
Clicking "Copy Code" button will copy the code into the clipboard - memory. Please paste(Ctrl+V) it in your destination. The code will get pasted. Happy coding from Wikitechy - ruby on rails tutorial - rails guides - ruby rails - rubyonrails - learn ruby on rails - team
We can change it to this
def index
@published_posts = Post.published
@unpublished_posts = Post.unpublished
end
Clicking "Copy Code" button will copy the code into the clipboard - memory. Please paste(Ctrl+V) it in your destination. The code will get pasted. Happy coding from Wikitechy - ruby on rails tutorial - rails guides - ruby rails - rubyonrails - learn ruby on rails - team
We can move the logic to our post model
Output
- It look like this
scope :published, ->(timestamp = Time.now) { where('published_at <= ?', timestamp) }
scope :unpublished, ->(timestamp = Time.now) { where('published_at IS NULL OR published_at > ?', timestamp) }