diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb index 7c6df0bb1..852275863 100644 --- a/app/controllers/articles_controller.rb +++ b/app/controllers/articles_controller.rb @@ -1,20 +1,30 @@ class ArticlesController < ApplicationController - before_action :set_article, only: %i[ show edit update destroy ] + # Ensures that the set_article method is called before the specified actions + before_action :set_article, only: %i[show edit update destroy] + # Displays a list of articles, filtered by title if a query parameter is present def index - @articles = Article.all + if params[:query].present? + @articles = Article.where("title LIKE ?", params[:query]) + else + @articles = Article.all + end end + # Displays the details of a specific article def show end + # Initializes a new article instance for creation def new @article = Article.new end + # Renders the form for editing an existing article def edit end + # Creates a new article based on parameters, and renders turbo_stream if successful def create @article = Article.new(article_params) if @article.save @@ -22,20 +32,22 @@ def create format.turbo_stream end else - format.html { render :new, status: :unprocessable_entity } + render :new, status: :unprocessable_entity end end + # Updates an existing article with the provided parameters, redirects on success def update if @article.update(article_params) respond_to do |format| format.html { redirect_to article_url(@article), notice: "Article was successfully updated." } end else - format.html { render :edit, status: :unprocessable_entity } + format.html { render :edit, status: :unprocessable_entity } end end + # Destroys the specified article instance, rendering turbo_stream def destroy @article.destroy! @@ -45,10 +57,12 @@ def destroy end private + # Sets the @article instance variable based on the provided ID parameter def set_article @article = Article.find(params[:id]) end + # Defines the permitted parameters for article creation and updates def article_params params.require(:article).permit(:title, :content, :author, :date) end diff --git a/app/helpers/articles_helper.rb b/app/helpers/articles_helper.rb index 296827759..13fac9077 100644 --- a/app/helpers/articles_helper.rb +++ b/app/helpers/articles_helper.rb @@ -1,2 +1,9 @@ module ArticlesHelper + def display_errors_for_field(object, field) + if object.errors.any? + object.errors.full_messages_for(field).each do |message| + concat content_tag(:div, message, class: 'text-danger') + end + end + end end diff --git a/app/models/article.rb b/app/models/article.rb index f5d67900f..53a93dfa7 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -1,6 +1,10 @@ class Article < ApplicationRecord - + # Validates presence of title and content fields validates :title, presence: true validates :content, presence: true + # Defines a class method to search for articles based on a query + def self.search(query) + where("title LIKE :query OR content LIKE :query", query: "%#{query}%") + end end diff --git a/app/views/articles/_article.html.erb b/app/views/articles/_article.html.erb index 9c3ac747b..320abd1f4 100644 --- a/app/views/articles/_article.html.erb +++ b/app/views/articles/_article.html.erb @@ -2,7 +2,7 @@

Title: - <%= article.title %> + <%= link_to article.title, article, data: { turbo_frame: '_top'} %>

diff --git a/app/views/articles/_form.html.erb b/app/views/articles/_form.html.erb index 0aa9822c3..5a0d9b689 100644 --- a/app/views/articles/_form.html.erb +++ b/app/views/articles/_form.html.erb @@ -1,25 +1,16 @@

<%= form_with(model: article) do |form| %> - <% if article.errors.any? %> -
-

<%= pluralize(article.errors.count, "error") %> prohibited this article from being saved:

- -
    - <% article.errors.each do |error| %> -
  • <%= error.full_message %>
  • - <% end %> -
-
- <% end %>
<%= form.label :title, style: "display: block" %> <%= form.text_field :title, class: 'form-control' %> + <% display_errors_for_field(@article, :title) %>
<%= form.label :content, style: "display: block" %> <%= form.text_field :content, class: 'form-control' %> + <% display_errors_for_field(@article, :content) %>
@@ -31,8 +22,9 @@ <%= form.hidden_field :date, class: 'form-control', value: Time.now %>
-
+
<%= form.submit class: 'btn btn-success mt-2 w-100' %> + <%= link_to 'Cancel', root_path, class: 'btn btn-danger mt-2'%>
<% end %>
\ No newline at end of file diff --git a/app/views/articles/index.html.erb b/app/views/articles/index.html.erb index 7d6a34d6e..9c9fcc296 100644 --- a/app/views/articles/index.html.erb +++ b/app/views/articles/index.html.erb @@ -1,8 +1,22 @@

Encyclopedia

CRUD with Rails


+ +<%= form_with(url: articles_path, method: :get, data: { turbo_frame: "article", turbo_action: 'advance' }) do |form| %> +
+ <%= form.text_field :query, class: 'form-control' %> + <%= form.submit class: 'btn btn-success' %> + <% if params[:query].present? %> + <%= link_to 'Clear', articles_path, class: 'btn btn-danger' %> + <% end %> +
+<% end %> + +
+ <%= link_to 'Add Article', new_article_path, data: { turbo_frame: dom_id(Article.new) }, class: 'btn btn-dark' %> <%= turbo_frame_tag Article.new %> +
<% @articles.each do |article| %> <%= render article %> diff --git a/config/routes.rb b/config/routes.rb index 0f5dddbb7..7980624ce 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ Rails.application.routes.draw do root "articles#index" + get '/search', to: "articles#search" resources :articles get "up" => "rails/health#show", as: :rails_health_check end diff --git a/test/fixtures/articles.yml b/test/fixtures/articles.yml index 3775fe7a8..ee2868227 100644 --- a/test/fixtures/articles.yml +++ b/test/fixtures/articles.yml @@ -1,11 +1,11 @@ # Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - title: MyString - content: MyString - author: MyString +# one: +# title: MyString +# content: MyString +# author: MyString -two: - title: MyString - content: MyString - author: MyString +# two: +# title: MyString +# content: MyString +# author: MyString