{"id":27137140,"url":"https://github.com/recheeduardo/blogalizando","last_synced_at":"2026-05-04T20:36:38.380Z","repository":{"id":270612849,"uuid":"910323579","full_name":"RecheEduardo/blogalizando","owner":"RecheEduardo","description":"Bem vindo ao Blogalizando! Um app completamente interativo utilizando o principal framework da linguagem ruby: Ruby on Rails! 🚂🏮","archived":false,"fork":false,"pushed_at":"2025-03-24T11:39:21.000Z","size":60481,"stargazers_count":1,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-08T03:46:30.110Z","etag":null,"topics":["bootstrap","devise","fullstack","kaminari","mvc","pundit","ruby","ruby-on-rails","sqlite3"],"latest_commit_sha":null,"homepage":"https://blogalizando.onrender.com/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RecheEduardo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-31T01:34:14.000Z","updated_at":"2025-01-07T00:04:45.000Z","dependencies_parsed_at":"2025-01-01T20:29:02.234Z","dependency_job_id":"5621174a-dbd7-4750-9bde-4791408f0e07","html_url":"https://github.com/RecheEduardo/blogalizando","commit_stats":null,"previous_names":["recheeduardo/blogalizando"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RecheEduardo/blogalizando","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RecheEduardo%2Fblogalizando","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RecheEduardo%2Fblogalizando/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RecheEduardo%2Fblogalizando/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RecheEduardo%2Fblogalizando/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RecheEduardo","download_url":"https://codeload.github.com/RecheEduardo/blogalizando/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RecheEduardo%2Fblogalizando/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264232260,"owners_count":23576806,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bootstrap","devise","fullstack","kaminari","mvc","pundit","ruby","ruby-on-rails","sqlite3"],"created_at":"2025-04-08T03:46:48.207Z","updated_at":"2026-03-16T15:02:00.577Z","avatar_url":"https://github.com/RecheEduardo.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n   \u003cimg src=\"https://readme-typing-svg.herokuapp.com?font=Century+Gothic\u0026weight=800\u0026size=48\u0026pause=1000\u0026color=F7F7F7\u0026center=true\u0026vCenter=true\u0026width=435\u0026lines=%E2%99%A6%EF%B8%8F+Blogalizando+%E2%99%A6%EF%B8%8F\" alt=\"Typing SVG\" /\u003e  \n\u003c/p\u003e\n\n---\n\n\u003ch1 align=\"center\"\u003e❗📺 NOVO UPDATE! CLIQUE NA LOGO DO RAILS ABAIXO PARA VER O VÍDEO COMPLETO DE EXPLICAÇÃO E VISUALIZAÇÃO DO PROJETO\u003c/h1\u003e\n\n\u003ca href=\"https://www.youtube.com/watch?v=0C7U4U3IDXU\" target=\"_blank\"\u003e \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/512px-Ruby_On_Rails_Logo.svg.png\"/\u003e \u003c/a\u003e\n\n---\n\u003ch3\u003e\u003ca href=\"https://blogalizando.onrender.com\" target=\"_blank\"\u003e ✔ Link para o site\u003c/a\u003e\n\u003cbr\u003e\u003cbr\u003e\n🟥 pode ser que demore para carregar devido a hospedagem e situação do servidor Render\u003c/h3\u003e\n\n---\n\n### • 💡 Tutorial para criação de contas no mailer ( uso da gem opener_web explicada no vídeo acima, minuto: 07:45 )\n\nhttps://github.com/user-attachments/assets/c772c326-2c93-451b-ae55-96e6e5aafdc8\n\n---\n\nBem-vindo ao **Blogalizando!**, um projeto de blog desenvolvido em **Ruby on Rails** com a arquitetura **MVC (Model-View-Controller)**. O objetivo do Blogalizando é fornecer uma aplicação web de gerenciamento de posts, com funcionalidades essenciais como cadastro e autenticação de usuários, gerenciamento de permissões de acesso e navegação otimizada através de paginação. A aplicação também segue boas práticas de desenvolvimento e segurança para garantir uma experiência robusta e agradável para os usuários.\n\n---\n\n# 🚀 Tecnologias Utilizadas\n\n## O projeto foi desenvolvido com as seguintes tecnologias:\n\n\u003cimg src=\"https://img.shields.io/badge/Ruby-CC342D?style=for-the-badge\u0026logo=ruby\u0026logoColor=white\" height=\"35\"  /\u003e\n\nA linguagem de programação principal utilizada no projeto. Ruby é uma linguagem dinâmica, de alto nível e orientada a objetos, muito conhecida pela simplicidade e elegância de sua sintaxe. Sua combinação com o Rails permite que o desenvolvimento de aplicações web seja ágil e com boa legibilidade do código. Ruby promove a produtividade do desenvolvedor com um ecossistema de bibliotecas e ferramentas bem estruturado, seguindo o príncipio CoC (Convention over Configuration).\n\n##\n\n\u003cimg src=\"https://img.shields.io/badge/Ruby_on_Rails-CC0000?style=for-the-badge\u0026logo=ruby-on-rails\u0026logoColor=white\" height=\"35\"  /\u003e\n\nFramework full-stack utilizado para estruturar a aplicação. Rails adota convenções que tornam o desenvolvimento de aplicações web mais rápido e eficiente, com muitas funcionalidades prontas para uso, como o roteamento, manipulação de banco de dados, e renderização de views. A arquitetura **MVC** do Rails separa claramente a lógica de controle, visualização e acesso a dados, facilitando a manutenção e escalabilidade do sistema.\n\n##\n\n\u003cimg src=\"https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge\u0026logo=bootstrap\u0026logoColor=white\" height=\"35\"  /\u003e\n\nFramework CSS utilizado para estilizar e tornar a interface da aplicação mais agradável e responsiva. O Bootstrap facilita o design da aplicação, proporcionando uma interface limpa e consistente em dispositivos móveis e desktop sem a necessidade de criar CSS do zero. Ele inclui componentes como botões, formulários, modais e grids, que são amplamente utilizados para garantir uma experiência de usuário rica e adaptável.\n\n##\n\n\u003cimg src=\"https://img.shields.io/badge/Sqlite-003B57?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white\" height=\"35\"  /\u003e\n\nBanco de dados utilizado durante o desenvolvimento da aplicação. SQLite é uma solução de banco de dados leve, ideal para ambientes de desenvolvimento e testes. Ele não requer uma instalação de servidor e armazena dados localmente no sistema de arquivos, facilitando a configuração do projeto em máquinas de desenvolvimento.\n\n##\n\n\u003cimg src=\"https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\" height=\"35\"  /\u003e\n\nBanco de dados utilizado em produção, oferecendo maior robustez e desempenho para lidar com grandes volumes de dados. O PostgreSQL é um banco de dados relacional de código aberto conhecido por sua confiabilidade, performance e conformidade com padrões SQL. Ele é ideal para ambientes de produção, onde a consistência e escalabilidade dos dados são essenciais.\n\n---\n\n# 📦 Gems Utilizadas\n\nO projeto utiliza diversas gems para tornar a aplicação mais funcional, segura e otimizada. Aqui estão algumas das principais gems:\n\n## **Devise** 🔒\n   **Uso**: Implementa autenticação de usuários de forma simples e segura.\n\n   **Funcionalidades**:\n   - Cadastro de usuário\n   - Login/logout\n   - Recuperação de senha\n   - Confirmação de conta\n   - Autenticação de múltiplos modelos de usuários\n\n   **Benefício**: O **Devise** é uma gem completa e muito utilizada no ecossistema Ruby on Rails para gerenciar autenticação de usuários. Com essa gem, podemos implementar todas as funcionalidades de segurança necessárias de forma rápida e confiável. Em vez de construir esses recursos do zero, o Devise oferece uma solução pronta para uso, com boas práticas de segurança já implementadas.\n\n## **Pundit** 🛡️\n   **Uso**: Fornece autorização baseada em políticas, controlando quem pode ou não acessar certas ações e recursos.\n\n   **Funcionalidades**:\n   - Define regras de autorização para diferentes tipos de usuários.\n   - Permite criar políticas de acesso detalhadas para recursos como posts e categorias.\n   - Protege ações no controle de acesso, como visualizar, editar ou excluir posts.\n\n   **Benefício**: O **Pundit** facilita a criação de políticas de autorização para garantir que apenas usuários autorizados possam realizar certas ações na aplicação. Ele trabalha de forma simples e flexível, permitindo que você defina permissões de maneira clara e compreensível, sem sobrecarregar o código.\n\n## **Kaminari** 📑\n   **Uso**: Implementa paginação para o conteúdo exibido na aplicação, como posts do blog.\n\n   **Funcionalidades**:\n   - Divide grandes conjuntos de dados em páginas menores e navegáveis.\n   - Permite ao usuário navegar pelas páginas de posts de forma fluida e eficiente.\n   - Suporte a personalização do layout da paginação para melhor integrar com o design da aplicação.\n\n   **Benefício**: A gem **Kaminari** melhora a performance da aplicação, carregando dados de forma eficiente, sem sobrecarregar o servidor com grandes volumes de informação. Ela também melhora a experiência do usuário, dividindo o conteúdo de maneira que fique mais fácil navegar, sem que a interface fique lenta ou congestionada.\n\n## **Simple Form** ✍️\n   **Uso**: Facilita a criação e personalização de formulários no Rails.\n\n   **Funcionalidades**:\n   - Gera automaticamente campos de formulário com base nos atributos do modelo.\n   - Permite uma integração fácil com o Bootstrap para estilização de formulários.\n   - Suporta validações e exibe erros de forma clara e visualmente atraente.\n\n   **Benefício**: O **Simple Form** torna a criação de formulários mais rápida e eficiente, com menos código. Ele também garante que os formulários gerados sejam consistentes, responsivos e integrados com as convenções do Bootstrap. A gem elimina a necessidade de escrever HTML para cada campo manualmente, economizando tempo e esforço de desenvolvimento.\n\n---\n\n## ⚙️ Configuração e Instalação\n\n### 1. Clonando o Repositório\n\nPara clonar o repositório do projeto, execute o seguinte comando no terminal:\n\n```bash\ngit clone https://github.com/seuusuario/blogalizando.git\ncd blogalizando\n```\n\n### 2. Instalando as Dependências\n\nCertifique-se de ter o **Ruby** e o **Rails** instalados em sua máquina. Caso contrário, consulte a [documentação oficial do Rails](https://guides.rubyonrails.org/getting_started.html) para instruções de instalação.\n\nApós garantir que as dependências estejam instaladas, rode o seguinte comando para instalar as gems necessárias:\n\n```bash\nbundle install\n```\n\nEsse comando instalará todas as gems listadas no arquivo `Gemfile` e permitirá que o projeto funcione corretamente.\n\n### 3. Banco de Dados\n\nCrie e migre o banco de dados com os seguintes comandos:\n\n```bash\nrails db:create\nrails db:migrate\n```\n\nDurante o desenvolvimento, estamos utilizando **SQLite3** como banco de dados. Quando for para produção, o banco de dados será **PostgreSQL**, então certifique-se de configurar o PostgreSQL no ambiente de produção, conforme a [documentação do Rails](https://guides.rubyonrails.org/configuring.html#configuring-databases).\n\n### 4. Rodando a Aplicação\n\nPara iniciar o servidor local, basta rodar o seguinte comando:\n\n```bash\nrails server\n```\n\nA aplicação estará disponível em `http://localhost:3000`.\n\n---\n\n## 🧩 Funcionalidades\n\n- **Cadastro de Usuários**: Usuários podem se registrar, fazer login e gerenciar suas contas com a gem **Devise**. As funcionalidades de recuperação de senha e confirmação de conta são fornecidas automaticamente pelo Devise.\n  \n- **Autorização**: A gem **Pundit** é utilizada para controlar o acesso às funcionalidades do blog, garantindo que apenas administradores possam editar ou excluir posts. A política de acesso é definida com base nas funções dos usuários (por exemplo, admin ou visitante).\n\n- **Criação de Posts**: Usuários autenticados podem criar, editar e excluir posts no blog. Isso é feito de forma simples e direta, com a validação dos campos fornecidos através do **Simple Form**.\n\n- **Paginação de Posts**: A gem **Kaminari** garante que a lista de posts seja dividida em várias páginas, permitindo ao usuário navegar facilmente por uma grande quantidade de conteúdo sem prejudicar a performance.\n\n---\n\n## 📂 Estrutura do Projeto\n\n\n# Estrutura MVC Completa - Blogalizando\n\nEste documento oferece uma explicação detalhada e didática sobre a estrutura MVC do projeto **Blogalizando**, com foco nas entidades principais: **Usuários**, **Posts**, **Categorias** e **Comentários**. A estrutura MVC (Model-View-Controller) é fundamental no desenvolvimento de aplicações Rails, e aqui vamos explorar em profundidade como cada uma dessas entidades é tratada em termos de **Models**, **Views**, **Controllers**, **Helpers**, **Partials** e **Rotas**.\n\n---\n\n## 1. Modelo: **Usuário (User)**\n\n### 1.1. Model: `user.rb`\n\nO modelo `User` representa os usuários registrados na aplicação. A gem **Devise** é utilizada para gerenciar a autenticação, e o modelo `User` é configurado para suportar as funcionalidades padrão de cadastro, login, recuperação de senha e gerenciamento de conta.\n\n```ruby\nclass User \u003c ApplicationRecord\n  # Autenticação via Devise\n  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable\n\n  # Relacionamentos\n  has_many :posts\n  has_many :comments\n\n  # Validações\n  validates :email, presence: true, uniqueness: true\n  validates :password, length: { minimum: 6 }\nend\n```\n\n### 1.2. Funcionalidade e Relacionamentos\n\n- **Devise**: Fornece métodos como `sign_in`, `sign_out`, `current_user` e `authenticate_user!` para gerenciar a sessão do usuário.\n- **Relacionamento**: O modelo `User` possui um relacionamento **has_many** com os modelos `Post` e `Comment`, o que significa que um usuário pode ter vários posts e comentários associados.\n\n### 1.3. Controlador: `users_controller.rb`\n\nEmbora a autenticação seja gerenciada automaticamente pelo **Devise**, se desejarmos personalizar o comportamento de visualização ou edição de dados do usuário, podemos criar um controlador `UsersController` para gerenciar essas funcionalidades.\n\n```ruby\nclass UsersController \u003c ApplicationController\n  before_action :set_user, only: [:show, :edit, :update]\n\n  def show\n    # Exibe os detalhes de um usuário\n  end\n\n  def edit\n    # Exibe o formulário de edição de usuário\n  end\n\n  def update\n    # Atualiza os dados do usuário\n    if @user.update(user_params)\n      redirect_to @user, notice: 'Usuário atualizado com sucesso.'\n    else\n      render :edit\n    end\n  end\n\n  private\n\n  def set_user\n    @user = User.find(params[:id])\n  end\n\n  def user_params\n    params.require(:user).permit(:name, :email)\n  end\nend\n```\n\n### 1.4. View: `users/`\n\n#### `show.html.erb`\n\nA view `show` exibe informações detalhadas sobre o usuário.\n\n```erb\n\u003ch1\u003ePerfil de \u003c%= @user.name %\u003e\u003c/h1\u003e\n\u003cp\u003eEmail: \u003c%= @user.email %\u003e\u003c/p\u003e\n\n\u003ch2\u003eMeus Posts\u003c/h2\u003e\n\u003c% @user.posts.each do |post| %\u003e\n  \u003c%= render partial: 'posts/post', locals: { post: post } %\u003e\n\u003c% end %\u003e\n```\n\n#### `edit.html.erb`\n\nA view `edit` exibe um formulário para editar o perfil do usuário.\n\n```erb\n\u003c%= form_for @user do |f| %\u003e\n  \u003c%= f.label :name %\u003e\n  \u003c%= f.text_field :name %\u003e\n\n  \u003c%= f.label :email %\u003e\n  \u003c%= f.email_field :email %\u003e\n\n  \u003c%= f.submit 'Salvar alterações' %\u003e\n\u003c% end %\u003e\n```\n\n---\n\n## 2. Modelo: **Post**\n\n### 2.1. Model: `post.rb`\n\nO modelo `Post` representa um artigo ou postagem no blog. Um post pertence a um usuário e a uma categoria. Ele também pode ter muitos comentários.\n\n```ruby\nclass Post \u003c ApplicationRecord\n  # Relacionamentos\n  belongs_to :user\n  belongs_to :category\n  has_many :comments, dependent: :destroy\n\n  # Validações\n  validates :title, presence: true\n  validates :content, presence: true\n\n  # Métodos personalizados\n  def short_content\n    content.truncate(150)\n  end\nend\n```\n\n### 2.2. Funcionalidade e Relacionamentos\n\n- **Relacionamentos**: O modelo `Post` tem um relacionamento **belongs_to** com os modelos `User` e `Category`, o que significa que cada post pertence a um usuário e a uma categoria. Além disso, ele tem um relacionamento **has_many** com o modelo `Comment`, indicando que um post pode ter vários comentários associados.\n- **Método Personalizado**: O método `short_content` serve para exibir um resumo do conteúdo do post.\n\n### 2.3. Controlador: `posts_controller.rb`\n\nO controlador `PostsController` gerencia as ações de criação, exibição, edição, atualização e exclusão de posts.\n\n```ruby\nclass PostsController \u003c ApplicationController\n  before_action :set_post, only: [:show, :edit, :update, :destroy]\n\n  def new\n    @post = Post.new\n  end\n\n  def create\n    @post = current_user.posts.build(post_params)\n    if @post.save\n      redirect_to @post, notice: 'Post criado com sucesso.'\n    else\n      render :new\n    end\n  end\n\n  def show\n    # Exibe o post e seus comentários\n  end\n\n  private\n\n  def set_post\n    @post = Post.find(params[:id])\n  end\n\n  def post_params\n    params.require(:post).permit(:title, :content, :category_id)\n  end\nend\n```\n\n### 2.4. View: `posts/`\n\n#### `new.html.erb`\n\nA view `new` exibe o formulário para criar um novo post.\n\n```erb\n\u003c%= form_for @post do |f| %\u003e\n  \u003c%= f.label :title %\u003e\n  \u003c%= f.text_field :title %\u003e\n\n  \u003c%= f.label :content %\u003e\n  \u003c%= f.text_area :content %\u003e\n\n  \u003c%= f.label :category %\u003e\n  \u003c%= f.collection_select :category_id, Category.all, :id, :name %\u003e\n\n  \u003c%= f.submit 'Criar Post' %\u003e\n\u003c% end %\u003e\n```\n\n#### `show.html.erb`\n\nA view `show` exibe os detalhes de um post, incluindo seus comentários.\n\n```erb\n\u003ch1\u003e\u003c%= @post.title %\u003e\u003c/h1\u003e\n\u003cp\u003e\u003c%= @post.content %\u003e\u003c/p\u003e\n\n\u003ch2\u003eComentários\u003c/h2\u003e\n\u003c%= render partial: 'comments/comment_form', locals: { post: @post } %\u003e\n\u003c% @post.comments.each do |comment| %\u003e\n  \u003c%= render partial: 'comments/comment', locals: { comment: comment } %\u003e\n\u003c% end %\u003e\n```\n\n#### Partial: `_post.html.erb`\n\n```erb\n\u003cdiv class=\"post\"\u003e\n  \u003ch3\u003e\u003c%= post.title %\u003e\u003c/h3\u003e\n  \u003cp\u003e\u003c%= post.short_content %\u003e\u003c/p\u003e\n  \u003c%= link_to 'Leia mais', post_path(post) %\u003e\n\u003c/div\u003e\n```\n\n---\n\n## 3. Modelo: **Categoria (Category)**\n\n### 3.1. Model: `category.rb`\n\nO modelo `Category` representa uma categoria à qual os posts pertencem. Uma categoria pode ter muitos posts.\n\n```ruby\nclass Category \u003c ApplicationRecord\n  has_many :posts\n\n  validates :name, presence: true\nend\n```\n\n### 3.2. Controlador: `categories_controller.rb`\n\nControlador para gerenciar a exibição das categorias.\n\n```ruby\nclass CategoriesController \u003c ApplicationController\n  def show\n    @category = Category.find(params[:id])\n    @posts = @category.posts\n  end\nend\n```\n\n### 3.3. View: `categories/`\n\n#### `show.html.erb`\n\n```erb\n\u003ch1\u003ePosts em \u003c%= @category.name %\u003e\u003c/h1\u003e\n\u003c% @posts.each do |post| %\u003e\n  \u003c%= render partial: 'posts/post', locals: { post: post } %\u003e\n\u003c% end %\u003e\n```\n\n---\n\n## 4. Modelo: **Comentário (Comment)**\n\n### 4.1. Model: `comment.rb`\n\nO modelo `Comment` representa os comentários feitos pelos usuários nos posts.\n\n```ruby\nclass Comment \u003c ApplicationRecord\n  belongs_to :post\n  belongs_to :user\n\n  validates :content, presence: true\nend\n```\n\n### 4.2. Controlador: `comments_controller.rb`\n\nControlador para gerenciar a criação e exibição de comentários.\n\n```ruby\nclass CommentsController \u003c ApplicationController\n  before_action :set_post\n\n  def create\n    @comment = @post.comments.build(comment_params)\n    @comment.user = current_user\n    if @comment.save\n      redirect_to @post, notice: 'Comentário adicionado com sucesso.'\n    else\n      render 'posts/show'\n    end\n  end\n\n  private\n\n  def set_post\n    @post = Post.find(params[:post_id])\n  end\n\n  def comment_params\n    params.require(:comment).permit(:content)\n  end\nend\n```\n\n### 4.3. View: `comments/`\n\n#### Partial: `_comment.html.erb`\n\n```erb\n\u003cdiv class=\"comment\"\u003e\n  \u003cp\u003e\u003c%= comment.user.name %\u003e disse:\u003c/p\u003e\n  \u003cp\u003e\u003c%= comment.content %\u003e\u003c/p\u003e\n\u003c/div\u003e\n```\n\n#### Partial: `_comment_form.html.erb`\n\n```erb\n\u003c%= form_for [post, post.comments.build] do |f| %\u003e\n  \u003c%= f.label :content, \"Seu comentário\" %\u003e\n  \u003c%= f.text_area :content %\u003e\n  \u003c%= f.submit \"Comentar\" %\u003e\n\u003c% end %\u003e\n```\n\n---\n\n## 5. Rotas\n\nNo arquivo `config/routes.rb`, as rotas são configuradas para permitir acesso a posts, categorias e comentários:\n\n```ruby\nRails.application.routes.draw do\n  devise_for :users\n  resources :users, only: [:show, :edit, :update]\n  resources :categories, only: [:show]\n  resources :posts do\n    resources :comments, only: [:create]\n  end\n\n  root 'posts#index'\nend\n```\n\n---\n\n## 🛠️ Como Contribuir\n\n1. Faça um fork deste repositório.\n2. Crie uma branch com sua feature: `git checkout -b minha-feature`.\n3. Comite suas alterações: `git commit -am 'Adicionando nova feature'`.\n4. Faça o push para a branch: `git push origin minha-feature`.\n5. Abra um Pull Request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecheeduardo%2Fblogalizando","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frecheeduardo%2Fblogalizando","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecheeduardo%2Fblogalizando/lists"}