私は個人的なプロジェクトのためにこれを修正しようとしていますが、今度はHartlチュートリアルを2回目にしています。今私は私のテストを渡すことができない理由(またはレンダリングするために設定ページを編集する)について困っています。問題はthis questionと非常に似ていますが、エラーは電子メールで返され、ダウンケースではなく、私はRspecではなくデフォルトのテストスイートを使用しています。ここでRailstutorial ActionView :: Template :: Error:定義されていないメソッド `email for nil:NilClass
はエラーコードです:
ERROR["test_unsuccessful_edit", UsersEditTest, 0.7226080000109505]
test_unsuccessful_edit#UsersEditTest (0.72s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `email' for nil:NilClass
app/helpers/users_helper.rb:6:in `gravatar_for'
app/views/users/edit.html.erb:8:in `_app_views_users_edit_html_erb___3727331653542369693_70276142435800'
test/integration/users_edit_test.rb:11:in `block in <class:UsersEditTest>'
そして、参照される各ファイル:
アプリ/ヘルパー/ user_helper
module UsersHelper
# Returns the Gravatar for the given user.
def gravatar_for(user, options = { size: 80 })
gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
size = options[:size]
gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
image_tag(gravatar_url, alt: user.name, class: "gravatar")
end
end
アプリ/ビュー/ユーザー/ edit.html.erb
<% provide(:title, "Edit user") %>
<% provide(:button_text, 'Edit account') %>
<h1>Update your profile</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="gravatar_edit">
<%= gravatar_for @user %>
<a href="http://gravatar.com/emails" target="_blank" rel="noopener noreferrer">change</a>
</div>
<%= render 'form' %>
</div>
</div>
te ST /統合/ users_edit_test.rb
require 'test_helper'
class UsersEditTest < ActionDispatch::IntegrationTest
def setup
@user = users(:michael)
end
test "unsuccessful edit" do
log_in_as(@user)
get edit_user_path(@user)
assert_template 'users/edit'
patch user_path(@user), params: { user: { name: "",
email: "[email protected]",
password: "foo",
password_confirmation: "bar" } }
assert_template 'users/edit'
end
end
そして、それは問題が他の質問であったので、ここではユーザモデルの関連する部分です。私が '!'最後のemail.downcaseメソッドには、電子メールを使用する他のすべてのテストは失敗しますが、すべてのテストは失敗します(このテストを除く)。
アプリ/モデル/ user.rb
class User < ApplicationRecord
attr_accessor :remember_token
before_save :downcase_email
...ここ
private
# Converts email to all lower-case
def downcase_email
self.email = email.downcase
end
はあなたに@user
インスタンス変数を設定する必要がありますユーザーコントローラ
app/controllers/user_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = 'Welcome to the Sample App'
redirect_to @user
else
render 'new'
end
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
# Handle a successful update.
else
render 'edit'
end
end
Rubocopを実行すると、エラーのユーザーヘルパーに固有の警告が表示されます。 app/helpers/users_helper.rb:5:5:W :Lint/UselessAssignment:variable - gravatar_idへの無駄な割り当て。 gravatar_id = Digest :: MD5 :: hexdigest(user.email.downcase) – oneWorkingHeadphone