Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何正确使用designe+;可确认的+;固定设施_Ruby On Rails_Devise_Devise Confirmable - Fatal编程技术网

Ruby on rails 如何正确使用designe+;可确认的+;固定设施

Ruby on rails 如何正确使用designe+;可确认的+;固定设施,ruby-on-rails,devise,devise-confirmable,Ruby On Rails,Devise,Devise Confirmable,我使用designe+Confirmable进行用户身份验证,使用Minitest+Capybara+fixture进行测试。我可以为用户进行工作登录测试,只要我包含某种形式的登录(使用helperlogin\u as(@user)或使用Capybara进入登录页面)和行@user。在运行之前确认 但是我如何确认夹具本身中的用户,这样我就不必每次都包括这一行了 现在我有: 已确认\u时间:现在 在yml中,但这似乎没有什么区别 下面是一个工作样本测试,如果它对说明有用的话: def setup

我使用designe+Confirmable进行用户身份验证,使用Minitest+Capybara+fixture进行测试。我可以为用户进行工作登录测试,只要我包含某种形式的登录(使用helper
login\u as(@user)
或使用Capybara进入登录页面)和行
@user。在运行之前确认

但是我如何确认夹具本身中的用户,这样我就不必每次都包括这一行了

现在我有:

已确认\u时间:现在

在yml中,但这似乎没有什么区别

下面是一个工作样本测试,如果它对说明有用的话:

def setup
    @user = users(:user)
  end

   test 'user should be redirected to profile edit on first login' do
     @user.confirm
     visit(new_user_session_path)
     fill_in('user_email', :with => @user.email)
     fill_in('user_password', :with => 'foobar')
     click_button('Log in')
     assert_current_path(edit_user_registration_path)
   end
和用户设备:

user:
  email: test1@example.com
  confirmed_at: Time.now
  encrypted_password: <%= Devise::Encryptor.digest(User, 'foobar') %>
  sign_in_count: 0
用户:
电邮:test1@example.com
确认时间:现在
加密密码:
登录计数:0

我更新了我的答案。找到了问题的解决办法。您需要按照指南中的配置,并调用方法user.confirm!模块内部控制器宏方法def login_user

开源github一个完整Desive Rspec项目的页面,包括测试


你在试图设置

User.confirmed_at = Time.now
但是,
confirm_at
至少在我的postegresql数据库中有
datetime
数据类型,因此这可能取决于您使用的数据库

confirmed_at: datetime
这就是时间。现在是格式

pry(main)> Time.now
=> 2017-03-14 11:14:06 +0100
user.confirmed_at
=> Sun, 05 Mar 2017 15:05:03 UTC +00:00
而这是
用户。在
格式处确认

pry(main)> Time.now
=> 2017-03-14 11:14:06 +0100
user.confirmed_at
=> Sun, 05 Mar 2017 15:05:03 UTC +00:00
因此,您应该使用兼容的格式/变量,尝试在DateTime类中搜索包含UTC as
DateTime的兼容格式。现在
返回:

[40] pry(main)> DateTime.now
=> Tue, 14 Mar 2017 11:19:25 +0100
DateTime
有一个
utc()
方法。如果我运行这个,它几乎就是所需要的

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc
=> 2005-02-21 16:11:12 UTC
检查DateTime api,如果需要,可以在github上检查utc()方法

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24))     # => Mon, 21 Feb 2005 10:11:12 -0600
DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 UTC


# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 168
def utc
  utc = new_offset(0)

  Time.utc(
    utc.year, utc.month, utc.day,
    utc.hour, utc.min, utc.sec + utc.sec_fraction
  )
end

那么用户已经创建、保存,但尚未确认?您想手动编辑该数据库字段吗?据我所知,设备实际上并未保存到数据库中。当我查看开发数据库中的用户时,两个fixture用户都不在那里。找到了问题的解决办法。您需要按照指南中的配置,并调用方法user.confirm!在模块ControllerMacros方法def login_user中,我认为这是正确的,但是dateTime.now对我不起作用。DB是默认的SQLite设置。在我读了这篇文章后,我在设计文档中找到了它。我尝试过这种语法,但运气不好。@OneWorkingHeadset有一种方法可以确认设计用户
。skipconfirmation。当您使用
user=user.new创建用户时,您将调用
user.skip\u确认
然后你保存它不会把用户数据从夹具中拉出来,是吗?@oneworkingheephone抱歉。我现在不能回答你。明天我会为你找到解决方案。谢谢你的跟进!您添加的说明确实有效,但不适用于fixtures+Minitest(它们适用于Rspec+FactoryGirl)。最后,我能够使用Minitest+FactoryGirl的一个版本来完成这项工作,但从未成功地将其用于固定装置。如果有用户后来发现了这个问题,我建议您使用FactoryGirl和Fabrizio链接的方法。