From 9684dd39dd0760b96d5eabd457cfc1d3ac31d0ae Mon Sep 17 00:00:00 2001 From: Trevor Vallender Date: Wed, 5 Jun 2024 18:46:27 +0100 Subject: [PATCH] Add CRUD actions for characters --- app/controllers/characters_controller.rb | 62 +++++++++++++++++++ app/views/characters/_character.html.erb | 4 ++ app/views/characters/_form.html.erb | 17 +++++ app/views/characters/edit.html.erb | 7 +++ app/views/characters/index.html.erb | 11 ++++ app/views/characters/new.html.erb | 5 ++ app/views/characters/show.html.erb | 16 +++++ app/views/layouts/application.html.erb | 1 + config/locales/en.yml | 29 ++++++++- config/routes.rb | 1 + .../controllers/characters_controller_test.rb | 55 ++++++++++++++++ 11 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 app/controllers/characters_controller.rb create mode 100644 app/views/characters/_character.html.erb create mode 100644 app/views/characters/_form.html.erb create mode 100644 app/views/characters/edit.html.erb create mode 100644 app/views/characters/index.html.erb create mode 100644 app/views/characters/new.html.erb create mode 100644 app/views/characters/show.html.erb create mode 100644 test/controllers/characters_controller_test.rb diff --git a/app/controllers/characters_controller.rb b/app/controllers/characters_controller.rb new file mode 100644 index 0000000..0c5ec8f --- /dev/null +++ b/app/controllers/characters_controller.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +class CharactersController < ApplicationController + before_action :set_character, only: [ :show, :edit, :update, :destroy ] + + def index + @characters = Current.user.characters + end + + def new + @character = Current.user.characters.new + end + + def create + @character = Current.user.characters.new(character_params) + if @character.save + redirect_to @character, notice: t(".success") + else + flash.now[:alert] = t(".error") + render :new, status: :unprocessable_entity + end + end + + def show + end + + def edit + end + + def update + if @character.update(character_params) + redirect_to @character, notice: t(".success", name: @character.name) + else + flash.now[:alert] = t(".error") + render :edit, status: :unprocessable_entity + end + end + + def destroy + name = @character.name + if @character.destroy + redirect_to characters_path, notice: t(".success", name:) + else + flash[:alert] = t(".error") + redirect_to characters_path + end + end + + private + + def set_character + @character = Current.user.characters.find(params[:id]) + end + + def character_params + params.require(:character).permit( + :name, + :game_system_id, + :table_id, + ) + end +end diff --git a/app/views/characters/_character.html.erb b/app/views/characters/_character.html.erb new file mode 100644 index 0000000..ad913dc --- /dev/null +++ b/app/views/characters/_character.html.erb @@ -0,0 +1,4 @@ +
> +
<%= link_to character.name, character %>
+

<%= character.game_system.name %>

+
diff --git a/app/views/characters/_form.html.erb b/app/views/characters/_form.html.erb new file mode 100644 index 0000000..51673bc --- /dev/null +++ b/app/views/characters/_form.html.erb @@ -0,0 +1,17 @@ +<%# locals: (button_text:) -%> + +<%= form_with model: @character do |f| %> + <%= f.label :name %> + <%= f.text_field :name%> + <%= display_form_errors(@character, :name) %> + + <%= f.label :game_system_id %> + <%= f.collection_select :game_system_id, GameSystem.all, :id, :name, required: true, include_blank: " " %> + <%= display_form_errors(@character, :game_system) %> + + <%= f.label :table_id %> + <%= f.collection_select :table_id, Current.user.tables, :id, :name, required: true, include_blank: " " %> + <%= display_form_errors(@character, :table) %> + + <%= f.submit button_text %> +<% end %> diff --git a/app/views/characters/edit.html.erb b/app/views/characters/edit.html.erb new file mode 100644 index 0000000..f884835 --- /dev/null +++ b/app/views/characters/edit.html.erb @@ -0,0 +1,7 @@ +<% content_for :title, t(".edit_character", name: @character.name) %> + +

<%= t(".edit_character", name: @character.name) %>

+ +<%= link_to t(".delete_character", name: @character.name), character_path(@character), + data: { turbo_method: :delete, turbo_confirm: t(".delete_character_confirmation", name: @character.name) } %> +<%= render partial: "form", locals: { button_text: t(".update") } %> diff --git a/app/views/characters/index.html.erb b/app/views/characters/index.html.erb new file mode 100644 index 0000000..1e84238 --- /dev/null +++ b/app/views/characters/index.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, t(".my_characters") %> + +

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

+ +<%= link_to t(".add_character"), new_character_path %> + +<% if @characters.any? %> + <%= render @characters %> +<% else %> +

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

+<% end %> diff --git a/app/views/characters/new.html.erb b/app/views/characters/new.html.erb new file mode 100644 index 0000000..c1760f2 --- /dev/null +++ b/app/views/characters/new.html.erb @@ -0,0 +1,5 @@ +<% content_for :title, t(".new_character") %> + +

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

+ +<%= render partial: "form", locals: { button_text: t(".create") } %> diff --git a/app/views/characters/show.html.erb b/app/views/characters/show.html.erb new file mode 100644 index 0000000..df61176 --- /dev/null +++ b/app/views/characters/show.html.erb @@ -0,0 +1,16 @@ +<% content_for :title, @character.name %> + +

<%= @character.name %>

+ +<%= link_to t(".edit"), edit_character_path(@character) %> + +
+
<%= t(".owner") %>
+
<%= link_to @character.user.username, @character.user %>
+
<%= t(".game_system") %>
+
<%= @character.game_system.name %>
+ <% if @character.table && @character.table.users.include?(Current.user) %> +
<%= t(".table") %>
+
<%= link_to @character.table.name, @character.table %>
+ <% end %> +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7c547c8..bed8668 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,6 +18,7 @@