【问题标题】:Rails 3.2 reload! not working as expectedRails 3.2 重新加载!没有按预期工作
【发布时间】:2015-09-09 16:11:26
【问题描述】:

我正在尝试在我的用户控制器上测试创建操作。要求是允许以前创建帐户但从未实际创建订阅的客户在注册时使用相同的电子邮件,但不受其原始密码的约束。我的测试如下:

 it "updates the user password for user with no entitlement" do
    user6 = Factory(:user)
    user_params_without_entitlement= { :email => user6.email, :password => "mynewpassword", :password_confirmation => "mynewpassword", publisher_id: user6.publisher_id }

    post :create, user_params_without_entitlement
    hash = Hashie::Mash.new(JSON.parse response.body)
    expect(hash[:errors].present?).to eq(false)
    expect(user6.password).to eq("mynewpassword")
  end

我的控制器看起来像:

def create
if @user.save && @user.activate!
      render :create, status: 200
    elsif @user.errors[:email].first == "Oops! Looks like you've already created an account. Please <a href='/account'>click here to sign in.</a>"
      user = User.find_by_email(params[:email])

      if user.user_entitlements.empty? && user.update_attributes(password: params[:password], password_confirmation: params[:password_confirmation])
        render :create, status: 200
      else
        render json: {errors: @user.errors}, status: 422
      end
    else
      if render json: {errors: @user.errors}, status: 422
      end
    end
end

如果我在下面放置一个绑定

user.user_entitlements.empty? && user.update_attributes(password: params[:password], password_confirmation: params[:password_confirmation])

然后我调用 user.password 我得到“mynewpassword”所以密码正在更新。在测试中虽然密码仍然显示为原始密码。我尝试添加 user6.reload!在期望块之前的测试中,我得到了

NoMethodError: undefined method `reload!' for #<User:0x007fa9a3342fc0>

我发现了这个问题:https://github.com/rweng/pry-rails/issues/9,这表明我应该修改我的 .pryrc 文件。我以前没有 .pryrc 文件。我创建了一个 .pryrc 文件,并一次尝试了这篇文章 (pry gem how to reload?) 中的所有内容,但没有成功。我在应用程序的根目录中创建了 .pryrc,此时我不知道该怎么做。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec pry


    【解决方案1】:

    object.reload 重新加载对象 - 没有 !bang 在控制台中,您使用reload! 重新加载孔应用模型。

    所以你的情况是user6.reload

    【讨论】:

    • 虽然调用 user6.reload 不会引发异常,但调用后仍显示旧密码。所以包含该行之后的测试 => Failure/Error: expect(user6.password).to eq('mynewpassword') expected: "mynewpassword" got: "monkey"
    • 好吧,请转到控制台并检查 model.reload,您会看到它已重新加载。更多我帮不了你
    【解决方案2】:

    只是为你解惑,如何正确使用object.reload

    用户拥有一份具有自动保存功能的个人资料。配置文件的保存后,配置文件正在计算年龄并将其写入用户。

    [69] pry(main)> a = User.last    
    [70] pry(main)> a.age
    => 80
    
    [71] pry(main)> a.profile.birthday = 18.years.ago
    [72] pry(main)> a.save
    ......
      SQL (0.3ms)  UPDATE "users" SET "age" = 18 WHERE "users"."id" = $1  [["id", 6]]
    ....
    
    [73] pry(main)> a.age
    => 80
    
    [74] pry(main)> a.reload
    
    [75] pry(main)> a.age
    => 18
    

    也许这会为您清除它。干杯

    【讨论】:

    • 我明白,但感谢您的澄清。由于某种原因,这种模式对我不起作用。
    【解决方案3】:

    好的,所以我不确定我是否真的诊断出了问题,但这是我对正在发生的事情的理论(我不会将其标记为答案,直到我给你们优秀的人一个机会来揭穿我的假设)。

    我认为由于 User 对象实际上没有密码属性(它具有 crypted_pa​​ssword 和 salt 属性),因此数据以某种方式不同步。我注意到,即使我通过电子邮件找到用户并调用 user.password,我也会在测试中得到一个 nil 值,但从控制器中的绑定中得到了正确的值。

    我首先使用新密码向会话控制器发布创建操作,这很有效,但感觉很脏。然后我查看了会话控制器实际上是如何验证密码的,瞧,我修复了我的测试以使用经过身份验证的?会话控制器正在使用的方法。也不要担心我也清理了嵌套的 if/else。所以我的测试看起来像:

    context "User without entitlements" do
          let(:user3) { Factory(:user) }
          let(:user_params_without_entitlement) { {:email => user3.email, :password => "mynewpassword", :password_confirmation => "mynewpassword", publisher_id: user3.publisher_id} }
    
          before do
            post :create, user_params_without_entitlement
          end
    
          it "updates the user password for user with no entitlement" do
    
            User.find_by_email(user3.email).authenticated?("mynewpassword").should be_true
          end
    
          it "returns a 200 if user password is updated" do
            expect(response.code).to eq('200')
          end
        end
    

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2012-11-01
      • 2011-12-01
      • 1970-01-01
      相关资源
      最近更新 更多