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