diff --git a/app/controllers/beers_controller.rb b/app/controllers/beers_controller.rb
index e2f27b3..786acc6 100644
--- a/app/controllers/beers_controller.rb
+++ b/app/controllers/beers_controller.rb
@@ -20,7 +20,7 @@ class BeersController < ApplicationController
# GET /beers/1/edit
def edit
@breweries = Brewery.all
- @styles = ["Weizen", "Lager", "Pale ale", "IPA", "Porter", "Lowalcohol"]
+ @styles = Style.all
end
# POST /beers or /beers.json
@@ -70,11 +70,11 @@ class BeersController < ApplicationController
# Only allow a list of trusted parameters through.
def beer_params
- params.require(:beer).permit(:name, :style, :brewery_id)
+ params.require(:beer).permit(:name, :style_id, :brewery_id)
end
def set_breweries_and_styles_for_template
@breweries = Brewery.all
- @styles = ["Weizen", "Lager", "Pale ale", "IPA", "Porter", "Lowalcohol"]
+ @styles = Style.all
end
end
diff --git a/app/models/beer.rb b/app/models/beer.rb
index e4ea2ad..9c13003 100644
--- a/app/models/beer.rb
+++ b/app/models/beer.rb
@@ -2,6 +2,7 @@ class Beer < ApplicationRecord
include RatingAverage
belongs_to :brewery
+ belongs_to :style
has_many :ratings, dependent: :destroy
has_many :users, through: :ratings
diff --git a/app/models/user.rb b/app/models/user.rb
index 232ad2f..d8432e2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -36,9 +36,10 @@ class User < ApplicationRecord
items = {}
ratings.each do |rating|
+ style = Style.find_by_id rating.beer.style_id
attributes = {
# create hash with key being style name and value first 0 and then the score
- "styles" => rating.beer.style,
+ "styles" => style.name,
# iterate through ratings and add scores depending on
# which brewery the beer that was rated was made in
"breweries" => rating.beer.brewery.name
diff --git a/app/views/beers/_beer.html.erb b/app/views/beers/_beer.html.erb
index bfc2c37..c3ae795 100644
--- a/app/views/beers/_beer.html.erb
+++ b/app/views/beers/_beer.html.erb
@@ -6,7 +6,7 @@
Style:
- <%= beer.style %>
+ <%= beer.style.name %>
diff --git a/app/views/beers/_form.html.erb b/app/views/beers/_form.html.erb
index c264366..a2dc50a 100644
--- a/app/views/beers/_form.html.erb
+++ b/app/views/beers/_form.html.erb
@@ -17,8 +17,8 @@
- <%= form.label :style, style: "display: block" %>
- <%= form.select :style, options_for_select(@styles) %>
+ <%= form.label :style_id, style: "display: block" %>
+ <%= form.select :style_id, options_from_collection_for_select(@styles, :id, :name) %>
diff --git a/spec/factories.rb b/spec/factories.rb
index 30423f8..3d01446 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -10,9 +10,13 @@ FactoryBot.define do
year { 2023 }
end
+ factory :style do
+ name { "Yes" }
+ end
+
factory :beer do
name { "Something good" }
- style { "Yes" }
+ style
brewery
end
diff --git a/spec/features/beers_page_spec.rb b/spec/features/beers_page_spec.rb
index f60547b..35db355 100644
--- a/spec/features/beers_page_spec.rb
+++ b/spec/features/beers_page_spec.rb
@@ -3,7 +3,8 @@ require "rails_helper"
describe "Beers page" do
let(:user) { FactoryBot.create :user }
let(:brewery){ FactoryBot.create :brewery }
- let(:beer){ FactoryBot.create :beer }
+ let(:style) { FactoryBot.create :style }
+ let(:beer){ FactoryBot.create :beer, brewery: brewery, style_id: style.id }
it "should be empty before tests" do
visit beers_path
@@ -16,6 +17,7 @@ describe "Beers page" do
it "should display all beers in the database" do
brewery.save()
+ style.save()
beer.save()
visit beers_path
@@ -26,6 +28,7 @@ describe "Beers page" do
it "should be able to add a new beer" do
user.save()
+ style.save()
brewery.save()
visit new_session_path
diff --git a/spec/models/beer_spec.rb b/spec/models/beer_spec.rb
index 3665762..0a6a229 100644
--- a/spec/models/beer_spec.rb
+++ b/spec/models/beer_spec.rb
@@ -2,19 +2,20 @@ require 'rails_helper'
RSpec.describe Beer, type: :model do
describe "creation" do
- let(:user){ User.create username: "Möötti", password: "Unsecure1"}
- let(:brewery){ Brewery.create name: "Creative", year: 2023 }
+ let(:user) { User.create username: "Möötti", password: "Unsecure1"}
+ let(:brewery) { Brewery.create name: "Creative", year: 2023 }
+ let(:style) { FactoryBot.create :style }
it "is successful with correct parameters" do
- beer = Beer.create name: "Hyvä juoma", style: "Yes", brewery_id: brewery.id
+ beer = Beer.create name: "Hyvä juoma", style_id: style.id, brewery_id: brewery.id
expect(beer).to be_valid
expect(beer.name).to eq "Hyvä juoma"
- expect(beer.style).to eq "Yes"
+ expect(beer.style_id).to eq style.id
expect(beer.brewery_id).to eq brewery.id
end
it "fails if no name is given" do
- beer = Beer.create style: "No", brewery_id: brewery.id
+ beer = Beer.create style_id: style.id, brewery_id: brewery.id
expect(beer).to_not be_valid
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 8456a11..c9bc034 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -29,8 +29,9 @@ RSpec.describe User, type: :model do
end
describe "favourite_style" do
- let(:user){ FactoryBot.create(:user) }
- let(:brewery){ FactoryBot.create(:brewery) }
+ let(:user) { FactoryBot.create(:user) }
+ let(:brewery) { FactoryBot.create(:brewery) }
+ let(:style) { FactoryBot.create(:style) }
it "is defined method" do
expect(user).to respond_to(:favorite_style)
@@ -41,16 +42,17 @@ RSpec.describe User, type: :model do
end
it "returns the most liked style" do
- create_beer_with_many_ratings({user: user, brewery: brewery}, 10, 10, 20)
- beer_with_favorite_style = FactoryBot.create(:beer, style: "No")
+ create_beer_with_many_ratings({user: user, brewery: brewery, style: style.id}, 10, 10, 20)
+ beer_with_favorite_style = FactoryBot.create :beer, style_id: style.id
FactoryBot.create(:rating, beer: beer_with_favorite_style, score: 50, user: user)
- expect(user.favorite_style).to eq "No"
+ expect(user.favorite_style).to eq "Yes"
end
it "also returns the most liked style" do
- create_beer_with_many_ratings({user: user, brewery: brewery}, 20, 30, 20)
- beer_with_favorite_style = FactoryBot.create(:beer, style: "No")
+ other_style = Style.create name: "No"
+ create_beer_with_many_ratings({user: user, brewery: brewery, style: style.id}, 20, 30, 20)
+ beer_with_favorite_style = FactoryBot.create(:beer, style_id: other_style.id)
FactoryBot.create(:rating, beer: beer_with_favorite_style, score: 50, user: user)
expect(user.favorite_style).to eq "Yes"
@@ -61,8 +63,9 @@ RSpec.describe User, type: :model do
let(:user){ FactoryBot.create(:user) }
let(:brewery1){ FactoryBot.create(:brewery) }
let(:brewery2){ FactoryBot.create(:brewery, name: "Boring") }
- before do create_beer_with_many_ratings({user: user, brewery: brewery1}, 20, 30, 20, 40) end
- before do create_beer_with_many_ratings({user: user, brewery: brewery2}, 20, 30, 20, 50) end
+ let(:style) { FactoryBot.create(:style) }
+ before do create_beer_with_many_ratings({user: user, brewery: brewery1, style: style.id}, 20, 30, 20, 40) end
+ before do create_beer_with_many_ratings({user: user, brewery: brewery2, style: style.id}, 20, 30, 20, 50) end
it "is a defined method" do
expect(user).to respond_to(:favorite_brewery)
@@ -78,7 +81,7 @@ RSpec.describe User, type: :model do
end
def create_beer_with_rating(object, score)
- beer = FactoryBot.create(:beer, brewery: object[:brewery])
+ beer = FactoryBot.create(:beer, brewery: object[:brewery], style_id: object[:style])
rating = FactoryBot.create(:rating, beer: beer, score: score, user: object[:user])
end