ruby on rails 4 - mega - Tutorial de Rails: método indefinido
ruby on rails tutorial español (1)
Estoy atascado (¡otra vez!) En el Capítulo 9 (esta vez en la sección 9.2.2) del tutorial Rails. estoy obteniendo
bundle exec rspec spec/
................................FFF........................
Failures:
1) Authentication authorization as wrong user submitting a GET request to the Users#edit action
Failure/Error: before {sign_in user, no_capybara: true}
NoMethodError:
undefined method `new_remember_token'' for #<User:0x007f8181815448>
# ./spec/support/utilities.rb:13:in `sign_in''
# ./spec/requests/authentication_pages_spec.rb:71:in `block (4 levels) in <top (required)>''
Los otros 2 errores son del mismo tipo.
Aquí está la especificación que causa los errores:
describe "as wrong user" do
let(:user) {FactoryGirl.create(:user)}
let(:wrong_user) {FactoryGirl.create(:user, email: "[email protected]")}
before {sign_in user, no_capybara: true}
describe "submitting a GET request to the Users#edit action" do
before {get edit_user_path(wrong_user)}
specify { expect(response.body).not_to match(full_title(''Edit user''))}
specify { expect(response).to redirect_to(root_url)}
end
describe "submitting a PATCH request to the Users#update action" do
before { patch user_path(wrong_user)}
specify { expect(response).to redirect_to(root_url)}
end
end
Y aquí está el método (utilities.rb) del que el mensaje de error se queja:
def sign_in (user, options={})
if options[:no_capybara]
# Sign in when not using Capybara
remember_token = User.new_remember_token
cookies[:remember_token]
user.update_attribute(:remember_token, User.digest(remember_token))
else
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end
end
El código para el modelo (User.rb) está aquí:
class User < ActiveRecord::Base
before_save { self.email = email.downcase}
before_create :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = //A[/w+/-.]+@[a-z/d/-.]+/.[a-z]+/z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
validates :password, length: {minimum: 6}
has_secure_password
def User.new_remember_token
SecureRandom.urlsafe_base64
end
def User.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
end
Anteriormente tuve problemas con el método sign_in, pero desapareció milagrosamente . ¿Qué estoy haciendo mal?
Finalmente encontré el culpable de los resultados de prueba erráticos que he estado observando en este caso y, muy probablemente, en ocasiones anteriores ( Error / Error: sign_in usuario método indefinido `sign_in '' , Rails named route no reconocido ). El problema parece ser que los rieles no borran por defecto el caché entre las pruebas. Lo cual es, en realidad, francamente aterrador. Parece que no puedes confiar en los resultados de la prueba. Me di cuenta de esto comentando el método del que se quejaba Rails y volviendo a ejecutar la prueba. El error persistió, lo que significaba una cosa: rspec simplemente estaba trabajando con algunas versiones almacenadas en caché de los archivos y, por lo tanto, haciendo caso omiso de los cambios que estoy realizando. Entonces, incluso si las pruebas pasan, no puedes estar seguro de que realmente lo hagan. Esto es realmente extraño. Después de darme cuenta del problema con un poco de google, encontré cómo forzar los rieles para limpiar el caché: compruebe la respuesta de jaustin aquí: ¿ se purga Rails.cache entre pruebas?