2017-01-30 24 views
0

私は個人的なプロジェクトのためにこれを修正しようとしていますが、今度は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 
+0

Rubocopを実行すると、エラーのユーザーヘルパーに固有の警告が表示されます。 app/helpers/users_helper.rb:5:5:W :Lint/UselessAssignment:variable - gravatar_idへの無駄な割り当て。 gravatar_id = Digest :: MD5 :: hexdigest(user.email.downcase) – oneWorkingHeadphone

答えて

2

ですUsersController#editアクション。そう

class UsersController < ApplicationController 
... 
    def edit 
    @user = User.find_by_id(params[:id]) 
    end 
... 
end 

のような問題が解決されない場合、あなたは私たちがあなたの問題を解決するのに役立つはずですここにあなたのUsersControllerコードを貼り付けることができます。しかし、あなたのコードをもっときれいにするために、コールバックを使って@userを設定し、そのコールバックを特定のアクションで呼び出すことができます。

+0

ユーザコントローラを追加したばかりです。私はインスタンス変数としてすでにそれを持っていたと思いますが、正しく書かれていないかもしれません。 – oneWorkingHeadphone

+0

あなたの 'UsersController'に' edit'アクションがありませんか? –

+0

私の例のように 'edit'を追加してください。すべてがうまくいくはずです。 –

関連する問題