NoMethodError: undefined method `name'
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
Discussão (0)
Carregando comentários...