Configuro a pasta do projeto da seguinte forma::/workspace/cookbook_parte7/rails generate migration RemoveRecipe_typeToRecipes recipe_type:string:/workspace/cookbook_parte7/rails db:migrate RAILS_ENV=test:/workspace/cookbook_parte7/rails generate models recipe_type name:string:/workspace/cookbook_parte7/rails db:migrate RAILS_ENV=test Faço as alterações em recipe_type.rb e 20191023142828_create_recipe_types.rb conforme mostrado abaixo e passo o comando novamente::/workspace/cookbook_parte7/rails db:migrate RAILS_ENV=test recipe_type.rb: class RecipeType < ApplicationRecord has_many:recipes,:class_name =>:Recipe
end 20191023142828_create_recipe_types.rb: class CreateRecipeTypes < ActiveRecord::Migration[5.2] def change create_table:recipe_types do |t| t.string:name t.timestamps end create_table:recipes do |t| t.belongs_to:recipe_type t.datetime:published_at t.timestamps end end
end routes.rb: Rails.application.routes.draw do root to: 'recipes#index' resources:recipes,:recipe_types
end recipes_controller.rb: class RecipesController < ApplicationController def index @recipes = Recipe.all end def show @recipe = Recipe.find(params[:id]) end def new @recipe = Recipe.new end def create @recipe = Recipe.new(recipe_params) if @recipe.save redirect_to @recipe else flash[:alert] = 'Você deve informar todos os dados da receita' render:new end end def edit @recipe = Recipe.find(params[:id]) end
def update @recipe = Recipe.find(params[:id]) if @recipe.update(recipe_params) redirect_to @recipe else flash[:alert] = 'Você deve informar todos os dados da receita' render:edit end end private def recipe_params params.require(:recipe).permit(:title,:recipe_type,:cuisine,:difficulty,:cook_time,:ingredients,:cook_method) end
end index.html.erb:
<h1>CookBook</h1>
<p>Bem-vindo ao maior livro de receitas online</p>
<%= link_to 'Enviar uma receita', new_recipe_path %> <% @recipes.each do |recipe| %>
<h1><%= link_to recipe.title, recipe %></h1> <ul> <li><%= recipe.recipe_type %></li> <li><%= recipe.cuisine %></li> <li><%= recipe.difficulty %></li> <li><%= recipe.cook_time_min %></li> </ul>
<% end %> visitor_visit_homepage_spec.rb: require 'rails_helper' feature 'Visitor visit homepage' do scenario 'successfully' do visit root_path expect(page).to have_css('h1', text: 'CookBook') expect(page).to have_css('p', text: 'Bem-vindo ao maior livro de receitas online') end scenario 'and view recipe' do #cria os dados necessários recipe_type = RecipeType.create(name: 'Sobremesa') recipe = Recipe.create(title: 'Bolo de cenoura', difficulty: 'Médio', recipe_type: recipe_type, cuisine: 'Brasileira', cook_time: 50, ingredients: 'Farinha, açucar, cenoura', cook_method: 'Cozinhe a cenoura, corte em pedaços pequenos, misture com o restante dos ingredientes') # simula a ação do usuário visit root_path # expectativas do usuário após a ação expect(page).to have_css('h1', text: recipe.title) expect(page).to have_css('li', text: recipe.recipe_type.name) expect(page).to have_css('li', text: recipe.cuisine) expect(page).to have_css('li', text: recipe.difficulty) expect(page).to have_css('li', text: "#{recipe.cook_time} minutos") end scenario 'and view recipes list' do #cria os dados necessários recipe_type = RecipeType.create(name: 'Sobremesa') another_recipe_type = RecipeType.create(name: 'Prato principal') recipe = Recipe.create(title: 'Bolo de cenoura', difficulty: 'Médio', recipe_type: recipe_type, cuisine: 'Brasileira', cook_time: 50, ingredients: 'Farinha, açucar, cenoura', cook_method: 'Cozinhe a cenoura, corte em pedaços pequenos, misture com o restante dos ingredientes') another_recipe = Recipe.create(title: 'Feijoada', recipe_type: another_recipe_type, cuisine: 'Brasileira', difficulty: 'Difícil', cook_time: 90, ingredients: 'Feijão e carnes', cook_method: 'Misture o feijão com as carnes') # simula a ação do usuário visit root_path # expectativas do usuário após a ação expect(page).to have_css('h1', text: recipe.title) expect(page).to have_css('li', text: recipe.recipe_type.name) expect(page).to have_css('li', text: recipe.cuisine) expect(page).to have_css('li', text: recipe.difficulty) expect(page).to have_css('li', text: "#{recipe.cook_time} minutos") expect(page).to have_css('h1', text: another_recipe.title) expect(page).to have_css('li', text: another_recipe.recipe_type.name) expect(page).to have_css('li', text: another_recipe.cuisine) expect(page).to have_css('li', text: another_recipe.difficulty) expect(page).to have_css('li', text: "#{another_recipe.cook_time} minutos") end
end Passo o seguinte comando do rspec::~/workspace/cookbook_parte7$ rspec./spec/features/visitor_visit_homepage_spec.rb:11
Run options: include {:locations=>{"./spec/features/visitor_visit_homepage_spec.rb"=>[11]}} Visitor visit homepage and view recipe (FAILED - 1) Failures: 1) Visitor visit homepage and view recipe Failure/Error: visit root_path SyntaxError: /home/massa-90/workspace/cookbook_parte7/app/views/recipes/index.html.erb:8: syntax error, unexpected tIVAR, expecting '('...r.append=( @recipe.@recipe_type.name ). @output_buffer.safe_a...... ^~~~~~~~~~~~ #./spec/features/visitor_visit_homepage_spec.rb:21:in `block (2 levels) in <top (required)>' Finished in 0.07533 seconds (files took 1.41 seconds to load)
1 example, 1 failure Failed examples: rspec./spec/features/visitor_visit_homepage_spec.rb:11 # Visitor visit homepage and view recipe O que pode estar faltando no código para passar nesse teste? Aguardo retorno. Obrigado, Marcelino