Tutorial de Michael Hartl v.3.2 Capítulo 7.17 NoMethodError em Usuários#nova Linha 4
-
14-11-2019 - |
Pergunta
Depois de pesquisar neste fórum, descobri que estou paralisado nesse assunto.Estou executando Rails 3.2.1 e Ruby 1.9.3
Acompanhei o livro de Hartl com muita atenção e estou enfrentando um erro no teste e na renderização da página de inscrição.
Aqui está o erro com algum rastreamento:
undefined method `model_name' for NilClass:Class
Extracted source (around line #4):
1: <% provide(:title, 'Sign up') %>
2: <h1>Sign up</h1>
3:
4: <%= form_for(@user) do |f| %>
5: <div class="field">
6: <%= f.label :name %><br />
7: <%= f.text_field :name %>
Rails.root: /Users/Brian/Sites/rails/brightspot_1-1
Application Trace | Framework Trace | Full Trace
app/views/users/new.html.erb:4:in
`_app_views_users_new_html_erb___4096651331723577149_70289685515940'
Aqui está meu novo.html.erb:
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :password_confirmation, "Confirmation" %><br />
<%= f.password_field :password_confirmation %>
</div>
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
E aqui está meu users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def new
end
end
O teste que está falhando:
require 'spec_helper'
describe "User pages" do
subject { page }
describe "profile page" do
let(:user) { FactoryGirl.create(:user) }
before { visit user_path(user) }
it { should have_selector('h1', text: user.name) }
it { should have_selector('title', text: user.name) }
end
describe "signup" do
before { visit signup_path }
describe "with invalid information" do
it "should not create a user" do
expect { click_button "Sign up" }.not_to change(User, :count)
end
end
describe "with valid information" do
before do
fill_in "Name", with: "Example User"
fill_in "Email", with: "user@example.com"
fill_in "Password", with: "foobar"
fill_in "Confirmation", with: "foobar"
end
it "should create a user" do
expect { click_button "Sign up" }.to change(User, :count).by(1)
end
end
end
end
E as mensagens de erro do rspec:
Failures:
1) User pages signup with invalid information should not create a user
Failure/Error: before { visit signup_path }
ActionView::Template::Error:
undefined method `model_name' for NilClass:Class
# ./app/views/users/new.html.erb:4:in
`_app_views_users_new_html_erb___947544063866573638_70125101083220'
# ./spec/requests/user_pages_spec.rb:17:in `block (3 levels) in <top (required)>'
2) User pages signup with valid information should create a user
Failure/Error: before { visit signup_path }
ActionView::Template::Error:
undefined method `model_name' for NilClass:Class
# ./app/views/users/new.html.erb:4:in
`_app_views_users_new_html_erb___947544063866573638_70125101083220'
# ./spec/requests/user_pages_spec.rb:17:in `block (3 levels) in <top (required)>'
Finished in 0.20414 seconds
2 examples, 2 failures
Qualquer ajuda com isso seria muito apreciada.Agradecemos antecipadamente, Brian.
Solução
Esse erro ocorre quando o @user
objeto que você está passando para form_for é nulo.Se você olhar em seu controlador, o new
método é definido duas vezes e na segunda definição ele não instancia um @user
objeto.
Exclua a segunda definição (vazia) do new
método em seu controlador e você deve estar pronto para prosseguir.