upto 3.10

This commit is contained in:
Aaro Koivukangas
2023-08-10 20:02:11 +03:00
parent babe5573b1
commit cb57e9643c
40 changed files with 634 additions and 1 deletions
+70
View File
@@ -0,0 +1,70 @@
class BeerclubsController < ApplicationController
before_action :set_beerclub, only: %i[ show edit update destroy ]
# GET /beerclubs or /beerclubs.json
def index
@beerclubs = Beerclub.all
end
# GET /beerclubs/1 or /beerclubs/1.json
def show
end
# GET /beerclubs/new
def new
@beerclub = Beerclub.new
end
# GET /beerclubs/1/edit
def edit
end
# POST /beerclubs or /beerclubs.json
def create
@beerclub = Beerclub.new(beerclub_params)
respond_to do |format|
if @beerclub.save
format.html { redirect_to beerclub_url(@beerclub), notice: "Beerclub was successfully created." }
format.json { render :show, status: :created, location: @beerclub }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @beerclub.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /beerclubs/1 or /beerclubs/1.json
def update
respond_to do |format|
if @beerclub.update(beerclub_params)
format.html { redirect_to beerclub_url(@beerclub), notice: "Beerclub was successfully updated." }
format.json { render :show, status: :ok, location: @beerclub }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @beerclub.errors, status: :unprocessable_entity }
end
end
end
# DELETE /beerclubs/1 or /beerclubs/1.json
def destroy
@beerclub.destroy
respond_to do |format|
format.html { redirect_to beerclubs_url, notice: "Beerclub was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_beerclub
@beerclub = Beerclub.find(params[:id])
end
# Only allow a list of trusted parameters through.
def beerclub_params
params.require(:beerclub).permit(:name, :founded, :city)
end
end
+72
View File
@@ -0,0 +1,72 @@
class MembershipsController < ApplicationController
before_action :set_membership, only: %i[ show edit update destroy ]
# GET /memberships or /memberships.json
def index
@memberships = Membership.all
end
# GET /memberships/1 or /memberships/1.json
def show
end
# GET /memberships/new
def new
@membership = Membership.new
@users = User.all
@beerclubs = Beerclub.all
end
# GET /memberships/1/edit
def edit
end
# POST /memberships or /memberships.json
def create
@membership = Membership.new(membership_params)
respond_to do |format|
if @membership.save
format.html { redirect_to membership_url(@membership), notice: "Membership was successfully created." }
format.json { render :show, status: :created, location: @membership }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @membership.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /memberships/1 or /memberships/1.json
def update
respond_to do |format|
if @membership.update(membership_params)
format.html { redirect_to membership_url(@membership), notice: "Membership was successfully updated." }
format.json { render :show, status: :ok, location: @membership }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @membership.errors, status: :unprocessable_entity }
end
end
end
# DELETE /memberships/1 or /memberships/1.json
def destroy
@membership.destroy
respond_to do |format|
format.html { redirect_to memberships_url, notice: "Membership was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_membership
@membership = Membership.find(params[:id])
end
# Only allow a list of trusted parameters through.
def membership_params
params.require(:membership).permit(:user_id, :beerclub_id)
end
end
+2
View File
@@ -0,0 +1,2 @@
module BeerclubsHelper
end
+2
View File
@@ -0,0 +1,2 @@
module MembershipsHelper
end
+16
View File
@@ -0,0 +1,16 @@
class Beerclub < ApplicationRecord
has_many :memberships, dependent: :destroy
has_many :users, through: :membership
validates :name, presence: true
validates :founded, numericality: { greater_than_or_equal_to: 1040,
only_integer: true }
validate :creation_year_not_in_future
def creation_year_not_in_future
if founded > Time.now.year
errors.add :founded, "cannot be in the future"
end
end
end
+4
View File
@@ -0,0 +1,4 @@
class Membership < ApplicationRecord
belongs_to :user
belongs_to :beerclub
end
+2
View File
@@ -5,4 +5,6 @@ class User < ApplicationRecord
has_many :ratings has_many :ratings
has_many :beers, through: :ratings has_many :beers, through: :ratings
has_many :memberships, dependent: :destroy
has_many :beer_clubs, through: :memberships
end end
+28
View File
@@ -0,0 +1,28 @@
<div id="<%= dom_id beerclub %>">
<p>
<strong>Name:</strong>
<%= beerclub.name %>
</p>
<p>
<strong>Founded:</strong>
<%= beerclub.founded %>
</p>
<p>
<strong>City:</strong>
<%= beerclub.city %>
</p>
<p>
<strong>Members:</strong>
<ul>
<% beerclub.memberships.each do |m| %>
<li>
<%= link_to m.user.username, user_path(m.user.id) %>
</li>
<% end%>
</ul>
</p>
</div>
@@ -0,0 +1,2 @@
json.extract! beerclub, :id, :name, :founded, :city, :created_at, :updated_at
json.url beerclub_url(beerclub, format: :json)
+32
View File
@@ -0,0 +1,32 @@
<%= form_with(model: beerclub) do |form| %>
<% if beerclub.errors.any? %>
<div style="color: red">
<h2><%= pluralize(beerclub.errors.count, "error") %> prohibited this beerclub from being saved:</h2>
<ul>
<% beerclub.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :name, style: "display: block" %>
<%= form.text_field :name %>
</div>
<div>
<%= form.label :founded, style: "display: block" %>
<%= form.number_field :founded %>
</div>
<div>
<%= form.label :city, style: "display: block" %>
<%= form.text_field :city %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
+10
View File
@@ -0,0 +1,10 @@
<h1>Editing beerclub</h1>
<%= render "form", beerclub: @beerclub %>
<br>
<div>
<%= link_to "Show this beerclub", @beerclub %> |
<%= link_to "Back to beerclubs", beerclubs_path %>
</div>
+14
View File
@@ -0,0 +1,14 @@
<p style="color: green"><%= notice %></p>
<h1>Beerclubs</h1>
<div id="beerclubs">
<% @beerclubs.each do |beerclub| %>
<%= render beerclub %>
<p>
<%= link_to "Show this beerclub", beerclub %>
</p>
<% end %>
</div>
<%= link_to "New beerclub", new_beerclub_path %>
+1
View File
@@ -0,0 +1 @@
json.array! @beerclubs, partial: "beerclubs/beerclub", as: :beerclub
+9
View File
@@ -0,0 +1,9 @@
<h1>New beerclub</h1>
<%= render "form", beerclub: @beerclub %>
<br>
<div>
<%= link_to "Back to beerclubs", beerclubs_path %>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @beerclub %>
<div>
<%= link_to "Edit this beerclub", edit_beerclub_path(@beerclub) %> |
<%= link_to "Back to beerclubs", beerclubs_path %>
<%= button_to "Destroy this beerclub", @beerclub, method: :delete %>
</div>
+1
View File
@@ -0,0 +1 @@
json.partial! "beerclubs/beerclub", beerclub: @beerclub
+2
View File
@@ -16,6 +16,7 @@
<%= link_to "beers", beers_path %> <%= link_to "beers", beers_path %>
<%= link_to "ratings", ratings_path %> <%= link_to "ratings", ratings_path %>
<%= link_to "users", users_path %> <%= link_to "users", users_path %>
<%= link_to "clubs", beerclubs_path %>
| |
<% if current_user.nil? %> <% if current_user.nil? %>
<%= link_to "Sign up", new_user_path %> <%= link_to "Sign up", new_user_path %>
@@ -23,6 +24,7 @@
<% else %> <% else %>
<%= link_to current_user.username, user_path(current_user.id) %> <%= link_to current_user.username, user_path(current_user.id) %>
<%= link_to "Rate a new beer", new_rating_path %> <%= link_to "Rate a new beer", new_rating_path %>
<%= link_to "Join a beer club", new_membership_path %>
<%= link_to "signout", signout_path, data: { "turbo-method": :delete } %> <%= link_to "signout", signout_path, data: { "turbo-method": :delete } %>
<% end %> <% end %>
</p> </p>
+27
View File
@@ -0,0 +1,27 @@
<%= form_with(model: membership) do |form| %>
<% if membership.errors.any? %>
<div style="color: red">
<h2><%= pluralize(membership.errors.count, "error") %> prohibited this membership from being saved:</h2>
<ul>
<% membership.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :user_id, style: "display: block" %>
<%= form.select :user_id, options_from_collection_for_select(@users, :id, :username) %>
</div>
<div>
<%= form.label :beerclub_id, style: "display: block" %>
<%= form.select :beerclub_id, options_from_collection_for_select(@beerclubs, :id, :name) %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>
@@ -0,0 +1,12 @@
<div id="<%= dom_id membership %>">
<p>
<strong>User:</strong>
<%= membership.user.username %>
</p>
<p>
<strong>Beer club:</strong>
<%= membership.beerclub.name %>
</p>
</div>
@@ -0,0 +1,2 @@
json.extract! membership, :id, :user_id, :beer_club_id, :created_at, :updated_at
json.url membership_url(membership, format: :json)
+9
View File
@@ -0,0 +1,9 @@
<h1>Editing membership</h1>
<%= render "form", membership: @membership %>
<br>
<div>
<%= link_to "Show this membership", @membership %> |
</div>
+14
View File
@@ -0,0 +1,14 @@
<p style="color: green"><%= notice %></p>
<h1>Memberships</h1>
<div id="memberships">
<% @memberships.each do |membership| %>
<%= render membership %>
<p>
<%= link_to "Show this membership", membership %>
</p>
<% end %>
</div>
<%= link_to "New membership", new_membership_path %>
@@ -0,0 +1 @@
json.array! @memberships, partial: "memberships/membership", as: :membership
+9
View File
@@ -0,0 +1,9 @@
<h1>New membership</h1>
<%= render "form", membership: @membership %>
<br>
<div>
<%= link_to "Back to clubs", beerclubs_path %>
</div>
+10
View File
@@ -0,0 +1,10 @@
<p style="color: green"><%= notice %></p>
<%= render @membership %>
<div>
<%= link_to "Edit this membership", edit_membership_path(@membership) %> |
<%= link_to "Back to clubs", beerclubs_path %>
<%= button_to "Destroy this membership", @membership, method: :delete %>
</div>
+1
View File
@@ -0,0 +1 @@
json.partial! "memberships/membership", membership: @membership
+10
View File
@@ -22,6 +22,16 @@
</ul> </ul>
</p> </p>
<p>
<strong>Beerclubs:</strong>
<ul>
<% @user.memberships.each do |m| %>
<li>
<%= link_to m.beerclub.name, beerclub_path(m.beerclub.id) %>
</li>
<% end%>
</ul>
</p>
<%= link_to "Edit this user", edit_user_path(@user) %> | <%= link_to "Edit this user", edit_user_path(@user) %> |
<%= link_to "Back to users", users_path %> <%= link_to "Back to users", users_path %>
+2
View File
@@ -1,4 +1,5 @@
Rails.application.routes.draw do Rails.application.routes.draw do
resources :beerclubs
resources :users resources :users
resources :beers resources :beers
resources :breweries resources :breweries
@@ -12,4 +13,5 @@ Rails.application.routes.draw do
delete 'signout', to: 'sessions#destroy' delete 'signout', to: 'sessions#destroy'
resources :ratings, only: [:index, :new, :create, :destroy] resources :ratings, only: [:index, :new, :create, :destroy]
resource :session, only: [:new, :create, :destroy] resource :session, only: [:new, :create, :destroy]
resources :memberships, only: [:new, :create, :destroy]
end end
@@ -0,0 +1,11 @@
class CreateBeerclubs < ActiveRecord::Migration[7.0]
def change
create_table :beerclubs do |t|
t.string :name
t.integer :founded
t.string :city
t.timestamps
end
end
end
@@ -0,0 +1,10 @@
class CreateMemberships < ActiveRecord::Migration[7.0]
def change
create_table :memberships do |t|
t.integer :user_id
t.integer :beer_club_id
t.timestamps
end
end
end
@@ -0,0 +1,5 @@
class RenameMembershipFields < ActiveRecord::Migration[7.0]
def change
rename_column :memberships, :beer_club_id, :beerclub_id
end
end
Generated
+16 -1
View File
@@ -10,7 +10,15 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_08_10_071347) do ActiveRecord::Schema[7.0].define(version: 2023_08_10_162557) do
create_table "beerclubs", force: :cascade do |t|
t.string "name"
t.integer "founded"
t.string "city"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "beers", force: :cascade do |t| create_table "beers", force: :cascade do |t|
t.string "name" t.string "name"
t.string "style" t.string "style"
@@ -26,6 +34,13 @@ ActiveRecord::Schema[7.0].define(version: 2023_08_10_071347) do
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
end end
create_table "memberships", force: :cascade do |t|
t.integer "user_id"
t.integer "beerclub_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "ratings", force: :cascade do |t| create_table "ratings", force: :cascade do |t|
t.integer "score" t.integer "score"
t.integer "beer_id" t.integer "beer_id"
@@ -0,0 +1,48 @@
require "test_helper"
class BeerclubsControllerTest < ActionDispatch::IntegrationTest
setup do
@beerclub = beerclubs(:one)
end
test "should get index" do
get beerclubs_url
assert_response :success
end
test "should get new" do
get new_beerclub_url
assert_response :success
end
test "should create beerclub" do
assert_difference("Beerclub.count") do
post beerclubs_url, params: { beerclub: { city: @beerclub.city, founded: @beerclub.founded, name: @beerclub.name } }
end
assert_redirected_to beerclub_url(Beerclub.last)
end
test "should show beerclub" do
get beerclub_url(@beerclub)
assert_response :success
end
test "should get edit" do
get edit_beerclub_url(@beerclub)
assert_response :success
end
test "should update beerclub" do
patch beerclub_url(@beerclub), params: { beerclub: { city: @beerclub.city, founded: @beerclub.founded, name: @beerclub.name } }
assert_redirected_to beerclub_url(@beerclub)
end
test "should destroy beerclub" do
assert_difference("Beerclub.count", -1) do
delete beerclub_url(@beerclub)
end
assert_redirected_to beerclubs_url
end
end
@@ -0,0 +1,48 @@
require "test_helper"
class MembershipsControllerTest < ActionDispatch::IntegrationTest
setup do
@membership = memberships(:one)
end
test "should get index" do
get memberships_url
assert_response :success
end
test "should get new" do
get new_membership_url
assert_response :success
end
test "should create membership" do
assert_difference("Membership.count") do
post memberships_url, params: { membership: { beer_club_id: @membership.beer_club_id, user_id: @membership.user_id } }
end
assert_redirected_to membership_url(Membership.last)
end
test "should show membership" do
get membership_url(@membership)
assert_response :success
end
test "should get edit" do
get edit_membership_url(@membership)
assert_response :success
end
test "should update membership" do
patch membership_url(@membership), params: { membership: { beer_club_id: @membership.beer_club_id, user_id: @membership.user_id } }
assert_redirected_to membership_url(@membership)
end
test "should destroy membership" do
assert_difference("Membership.count", -1) do
delete membership_url(@membership)
end
assert_redirected_to memberships_url
end
end
+11
View File
@@ -0,0 +1,11 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
name: MyString
founded: 1
city: MyString
two:
name: MyString
founded: 1
city: MyString
+9
View File
@@ -0,0 +1,9 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
user_id: 1
beer_club_id: 1
two:
user_id: 1
beer_club_id: 1
+7
View File
@@ -0,0 +1,7 @@
require "test_helper"
class BeerclubTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
+7
View File
@@ -0,0 +1,7 @@
require "test_helper"
class MembershipTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
+45
View File
@@ -0,0 +1,45 @@
require "application_system_test_case"
class BeerclubsTest < ApplicationSystemTestCase
setup do
@beerclub = beerclubs(:one)
end
test "visiting the index" do
visit beerclubs_url
assert_selector "h1", text: "Beerclubs"
end
test "should create beerclub" do
visit beerclubs_url
click_on "New beerclub"
fill_in "City", with: @beerclub.city
fill_in "Founded", with: @beerclub.founded
fill_in "Name", with: @beerclub.name
click_on "Create Beerclub"
assert_text "Beerclub was successfully created"
click_on "Back"
end
test "should update Beerclub" do
visit beerclub_url(@beerclub)
click_on "Edit this beerclub", match: :first
fill_in "City", with: @beerclub.city
fill_in "Founded", with: @beerclub.founded
fill_in "Name", with: @beerclub.name
click_on "Update Beerclub"
assert_text "Beerclub was successfully updated"
click_on "Back"
end
test "should destroy Beerclub" do
visit beerclub_url(@beerclub)
click_on "Destroy this beerclub", match: :first
assert_text "Beerclub was successfully destroyed"
end
end
+43
View File
@@ -0,0 +1,43 @@
require "application_system_test_case"
class MembershipsTest < ApplicationSystemTestCase
setup do
@membership = memberships(:one)
end
test "visiting the index" do
visit memberships_url
assert_selector "h1", text: "Memberships"
end
test "should create membership" do
visit memberships_url
click_on "New membership"
fill_in "Beer club", with: @membership.beer_club_id
fill_in "User", with: @membership.user_id
click_on "Create Membership"
assert_text "Membership was successfully created"
click_on "Back"
end
test "should update Membership" do
visit membership_url(@membership)
click_on "Edit this membership", match: :first
fill_in "Beer club", with: @membership.beer_club_id
fill_in "User", with: @membership.user_id
click_on "Update Membership"
assert_text "Membership was successfully updated"
click_on "Back"
end
test "should destroy Membership" do
visit membership_url(@membership)
click_on "Destroy this membership", match: :first
assert_text "Membership was successfully destroyed"
end
end