小编Are*_*epo的帖子

强制用户在首次使用 Devise 登录时重置密码

[预计到达时间最后更新为我当前的解决方案]

我希望能够为高价值用户手动创建帐户,这意味着我们必须为他们生成密码并让他们在首次登录时更改密码。我在这里找到了执行此操作的解决方案,但它似乎是围绕 Devise 而不是使用它。

我当前的工作是覆盖 Devise ConfirmationsController 中的 #after_confirmation_path_for 方法,以便它包含以下代码片段:

if resource.sign_in_count == 1
  resource.send(:set_reset_password_token)
  edit_password_path(resource, reset_password_token: @token)
else
  # etc
end
Run Code Online (Sandbox Code Playgroud)

但是当它遵循该路径时,它会重定向远离密码更改,这似乎是因为 Devise::PasswordsController 中的这一行:

# Render the #edit only if coming from a reset password email link
append_before_filter :assert_reset_token_passed, only: :edit
Run Code Online (Sandbox Code Playgroud)

所以我可以覆盖那个调用,但我很担心它为什么在那里,以及这是否会导致其他问题 - 即使不会,感觉就像我正在做很多黑客工作来实现我想要的场景想象中是比较常见的。有没有一种更 Devise-y 的方法来解决这个问题?

ETA:我已经使用以下代码成功跳过了过滤器:

class PasswordsController < Devise::PasswordsController
  skip_before_filter :require_no_authentication,
                     :assert_reset_token_passed, 
                     only: :edit
end
Run Code Online (Sandbox Code Playgroud)

这在相关的用户旅程中有效,但这是一个验收测试相对较少的应用程序,因此我有点担心这会在其他地方产生连锁反应 - 比如意外地要求用户在其他用户旅程中更改密码。

任何人都可以建议使用这种方法是否正常,或者是否有更安全的替代方法?

ruby-on-rails devise ruby-on-rails-4

5
推荐指数
1
解决办法
4019
查看次数

您可以同时测试 RSpec 中的状态更改和返回值吗?

假设我有一个方法MyKlass#do_thing,我想在测试中只调用一次(因为它可能会更改状态),并且应该true在成功更改状态时返回,false否则返回。我想写一个看起来像这样的规范:

it "Updates myvalue if condition is met" do
  wojit = MyKlass.new

  # ... assuming condition is met
  expect { wojit.do_thing }.to change { wojit.value }.and.be true
end
Run Code Online (Sandbox Code Playgroud)

但是这种特殊的方法会得到一个 ArgumentError,因为#and需要 1 个参数。

我可以让它与以下可憎的东西一起工作:

expect { expect(wojit.do_thing).to be true }.to change { wojit.value }
Run Code Online (Sandbox Code Playgroud)

但这太可怕了。我错过了更惯用的东西吗?

ruby rspec

5
推荐指数
2
解决办法
1104
查看次数

ImportError:Python 3中没有名为"models"的模块

我有一个新的Python项目,其models.py文件如下所示:

from django.db import models
from django.contrib.auth.models import User
from django.core.validators import MinValueValidator, MaxValueValidator

class Metric(models.Model):
  users = models.ManyToManyField(User, through = 'Vote')
  name = models.CharField(max_length = 255)

class Vote(models.Model):
  metric = models.ForeignKey(Metric, on_delete = models.CASCADE)
  user = models.ForeignKey(User, on_delete = models.CASCADE)
  rating = models.IntegerField(validators = [MinValueValidator(0), MaxValueValidator(10)])
  email = models.EmailField

  def __str__(self):
    return str(self.rating)
Run Code Online (Sandbox Code Playgroud)

和这样的admin.py文件:

from django.contrib import admin
from models import Metric, Vote

admin.site.register(Metric)
admin.site.register(Vote)
Run Code Online (Sandbox Code Playgroud)

使用Python 2.7.5运行时,启动应用程序运行正常.当我尝试使用Python 3.5.1运行它时,我得到错误ImportError: No module named 'models',使用此回溯:

Unhandled exception in thread started …
Run Code Online (Sandbox Code Playgroud)

django python-3.x

3
推荐指数
1
解决办法
5624
查看次数

我如何知道我使用的是哪个 Ruby 解释器?

我看过这个帖子,但我的问题可能更基本:

鉴于该线程 [1] 中接受的答案的响应是给我的,"/Users/username/.rvm/rubies/ruby-2.3.0/bin/ruby"我怎么知道那是 MRI、JRuby 等?如果是其他主要口译员,会是什么样子?


[1] 为了节省几秒钟, RbConfig.ruby

ruby rubinius jruby mri

3
推荐指数
2
解决办法
1607
查看次数

Rails 如何处理方法名称不友好的枚举值?

我有一个 (Rails) 类,它具有以下枚举值:

class DeploymentRequest
  enum frequency: ['One-off', 'Monthly', 'Quarterly', 'Annual']
  #...
end
Run Code Online (Sandbox Code Playgroud)

根据文档(尽管有点令我惊讶,区分大小写),DeploymentRequest 具有诸如#Monthly?#Monthly!等实例方法#Quarterly?(以及类方法.Monthly)。但“一次性”的价值是扔掉它和/或我。我试过了

dr.One_off?
dr.Oneoff?
dr.oneoff? # (one lives in hope)
Run Code Online (Sandbox Code Playgroud)

但没有一个有效(并且 Pry/IRB 没有提出任何有用的替代方案)。这里发生了什么事?Rails 是否只是没有定义任何这样的方法集,或者它是否为它们命名了我没有找到的名称?

ruby ruby-on-rails

2
推荐指数
1
解决办法
487
查看次数

在功能规范中存储内容模型实例的好方法是什么?

(我认为这个问题可以概括为任何广泛使用的API,但我根据我实际使用的代码提出问题)

我们在控制器和视图中广泛使用Contentful Model,包括我们的布局.这意味着在我们访问(比如说)主页的任何功能测试中,我们的控制器操作将包括以下内容:

class HomepageController < ApplicationController
  def homepage
    # ... other stuff
    @homepage_content = Homepage.find ('contentful_entry_id')
  end
end
Run Code Online (Sandbox Code Playgroud)

...其中Homepage是ContentfulModel :: Base的子类,而@homepage_content将在视图中对其进行各种调用(有时会链接).在页脚中有一个类似的实例变量集并重复使用.

因此,对于功能测试,这是一个痛苦.我只想出两个选择:

  1. 在所有Contentful模型实例上对每一个调用(几十个)进行存根,并使用存根方法链或确保它们返回合适的模拟

要么

  1. 使用像VCR这样的gem来存储每个功能规范的Contentful响应

这两个(至少我正在做的方式)都有相当不好的缺点:

1)导致一堆测试kruft,每次我们添加或删除相关模型中的字段时都必须更新;

2)意味着我们为每个功能测试生成一个vcr yaml文件 - 每当我们更改测试的一个元素时我们必须记住清除相关的yml文件,这会改变它发送的请求

我错过了第三种选择吗?或者是否有一些明智的方法来做上述任何一种选择而不会遇到主要缺点?

ruby-on-rails stubbing contentful

1
推荐指数
1
解决办法
254
查看次数

当RSpec测试时,Ruby的&&逻辑表现不一致

我有一个方法,包括(在后续行中)以下代码:

candidate_lines.each do |line| 
  return line if priority_1?(line) && line.marked_by?(self)
end
Run Code Online (Sandbox Code Playgroud)

据我所知,其中的方法是无关紧要的.是什么让我感到困惑,我有一个测试应该只是通过我给出的规范跳过该方法的一部分:

it "without any priority 1 lines, returns all priority 2 lines marked by itself" do
  line1 = double :line, marked_by?: true
  line2 = double :line, marked_by?: true
  allow(joshua).to receive(:priority_1?).and_return(:false)
  expect(joshua).to receive(:candidate_lines).and_return([line1, line2])
  expect(joshua.tiebreak_lines).to eq [line1, line2]
end
Run Code Online (Sandbox Code Playgroud)

然而,当我运行测试时,返回语句将被触发.我已经在'return line ...'行之前使用puts语句手动测试了它,结果是,'priority_1?(line)'返回false,由于某种原因'priority_1?(line)&& line. marked_by?(self)'正在评估为true.

这里发生了什么事?

ruby rspec boolean-expression

0
推荐指数
1
解决办法
49
查看次数