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 @@
CRUD with Rails