From 1e6a31ae787a02ed8b599d193918bd2d149cc29a Mon Sep 17 00:00:00 2001 From: Trevor Vallender Date: Thu, 5 Oct 2023 19:46:09 +0100 Subject: [PATCH] Basic blog post CRUD --- app/assets/stylesheets/blog_posts.css | 40 +++++++++++++ app/controllers/blog_posts_controller.rb | 63 ++++++++++++++++++++ app/views/blog_posts/_blog_post.html.erb | 8 +++ app/views/blog_posts/_form.html.erb | 15 +++++ app/views/blog_posts/edit.html.erb | 10 ++++ app/views/blog_posts/index.html.erb | 13 ++++ app/views/blog_posts/new.html.erb | 9 +++ app/views/blog_posts/show.html.erb | 1 + app/views/layouts/application.html.erb | 1 + config/locales/controllers/blog_posts/en.yml | 5 ++ config/locales/views/blog_posts/en.yml | 14 +++++ config/locales/views/layouts/application.yml | 1 + config/routes.rb | 1 + 13 files changed, 181 insertions(+) create mode 100644 app/assets/stylesheets/blog_posts.css create mode 100644 app/controllers/blog_posts_controller.rb create mode 100644 app/views/blog_posts/_blog_post.html.erb create mode 100644 app/views/blog_posts/_form.html.erb create mode 100644 app/views/blog_posts/edit.html.erb create mode 100644 app/views/blog_posts/index.html.erb create mode 100644 app/views/blog_posts/new.html.erb create mode 100644 app/views/blog_posts/show.html.erb create mode 100644 config/locales/controllers/blog_posts/en.yml create mode 100644 config/locales/views/blog_posts/en.yml diff --git a/app/assets/stylesheets/blog_posts.css b/app/assets/stylesheets/blog_posts.css new file mode 100644 index 0000000..7fe1cda --- /dev/null +++ b/app/assets/stylesheets/blog_posts.css @@ -0,0 +1,40 @@ +form#blog_post_form { + display: flex; + flex-direction: column; + max-width: 55em; + + > h2 { + width: 100%; + } + + > trix-toolbar { + max-width: 95%; + } + + > trix-editor { + width: 95%; + > ul { + list-style-type: disc; + } + } + + input[type=text] { + width: 95%; + } + + > input[type=submit] { + width: 95%; + } +} + +.blog_post { + margin: 1em auto; + padding: .5em; + background-color: var(--inset-background-color); + border: 1px solid var(--border-color); + + > .created_at { + text-align: right; + font-size: .8em; + } +} diff --git a/app/controllers/blog_posts_controller.rb b/app/controllers/blog_posts_controller.rb new file mode 100644 index 0000000..eab1540 --- /dev/null +++ b/app/controllers/blog_posts_controller.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +class BlogPostsController < ApplicationController + skip_before_action :require_login, only: [:index, :show] + before_action :set_blog_post, only: [:show, :edit, :update, :destroy] + + def index + @blog_posts = BlogPost.all.order(created_at: :desc) + end + + def new + @blog_post = BlogPost.new + end + + def create + @blog_post = BlogPost.new(blog_post_params) + @blog_post.user = helpers.current_user + if @blog_post.save + redirect_to @blog_post, notice: t(".created") + else + render :new, status: :unprocessable_entity + end + end + + def show + unless @blog_post.published || @blog_post.user == helpers.current_user + redirect_to blog_posts_path, notice: t(".not_found") + end + end + + def edit; end + + def update + if @blog_post.update(blog_post_params) + redirect_to @blog_post, notice: t(".updated") + else + render :edit, status: :unprocessable_entity + end + end + + def destroy + if @blog_post.destroy + redirect_to blog_posts_path, notice: t(".deleted") + else + render :edit, status: :unprocessable_entity + end + end + + private + + def blog_post_params + params.require(:blog_post).permit( + :title, + :content, + :published, + :slug, + ) + end + + def set_blog_post + @blog_post = BlogPost.find_by(slug: params[:id]) + end +end diff --git a/app/views/blog_posts/_blog_post.html.erb b/app/views/blog_posts/_blog_post.html.erb new file mode 100644 index 0000000..c5ad15c --- /dev/null +++ b/app/views/blog_posts/_blog_post.html.erb @@ -0,0 +1,8 @@ +
+

<%= blog_post.title %>

+ <%= blog_post.content %> +
+ <%= link_to "Edit", edit_blog_post_path(blog_post) if blog_post.user == current_user %> + <%= link_to blog_post.created_at.strftime("%Y-%m-%d %H:%M"), blog_post %> +
+
diff --git a/app/views/blog_posts/_form.html.erb b/app/views/blog_posts/_form.html.erb new file mode 100644 index 0000000..762ecce --- /dev/null +++ b/app/views/blog_posts/_form.html.erb @@ -0,0 +1,15 @@ +<%= form_with model: @blog_post, id: "blog_post_form" do |f| %> +

<%= title %>

+ + <%= f.text_field :title, placeholder: t(".title") %> + + <%= f.rich_text_area :content %> + + <%= f.label :slug %> + <%= f.text_field :slug %> + + <%= f.label :published %> + <%= f.check_box :published %> + + <%= f.submit button_text %> +<% end %> diff --git a/app/views/blog_posts/edit.html.erb b/app/views/blog_posts/edit.html.erb new file mode 100644 index 0000000..ea734f7 --- /dev/null +++ b/app/views/blog_posts/edit.html.erb @@ -0,0 +1,10 @@ +<% @title = t(".edit") %> + +<%= render partial: "form", + locals: { + user: @user, + button_text: t(".edit"), + title: t(".edit"), + } %> + +<%= link_to t(".delete"), @blog_post, data: { turbo_method: :delete, turbo_confirm: t(".confirm") } %> diff --git a/app/views/blog_posts/index.html.erb b/app/views/blog_posts/index.html.erb new file mode 100644 index 0000000..5247cad --- /dev/null +++ b/app/views/blog_posts/index.html.erb @@ -0,0 +1,13 @@ +

<%= t(".blog_posts") %>

+ +<%= link_to t(".new"), new_blog_post_path if logged_in? %> + +<% if @blog_posts.empty? %> +

<%= t(".empty") %>

+<% else %> + +<% end %> diff --git a/app/views/blog_posts/new.html.erb b/app/views/blog_posts/new.html.erb new file mode 100644 index 0000000..2912e92 --- /dev/null +++ b/app/views/blog_posts/new.html.erb @@ -0,0 +1,9 @@ +<% @title = t(".create") %> + +<%= render partial: "form", + locals: { + user: @user, + button_text: t(".create"), + title: t(".create"), + } %> + diff --git a/app/views/blog_posts/show.html.erb b/app/views/blog_posts/show.html.erb new file mode 100644 index 0000000..7a20ffe --- /dev/null +++ b/app/views/blog_posts/show.html.erb @@ -0,0 +1 @@ +<%= render @blog_post %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0c50034..3a956cf 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,6 +18,7 @@