2017-01-30 59 views
0

我正在通过Hartl教程第二次,只是这次我试图修改它的个人项目。现在我很难理解为什么我无法通过测试(或编辑设置页面呈现)。这个问题非常类似于this question,除了错误是为电子邮件返回而不是downcase,我使用默认测试套件而不是Rspec。RailstutorialActionView :: Template :: Error:未定义的方法`电子邮件'为零: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 

这里是用户控制器

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我也得到这样的警告用户特定的助手是在错误: 应用程序/佣工/ users_helper.rb:5:5:W :Lint/UselessAssignment:无用的赋值给变量 - gravatar_id。 gravatar_id =摘要:: MD5 :: hexdigest(user.email.downcase) – oneWorkingHeadphone

回答

2

您需要设置@user实例变量在您的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',一切都应该没问题。 –

相关问题