【问题标题】:`flash.discard` in Rails 2.3 fails because flash is a Hash, not a FlashHashRails 2.3 中的`flash.discard` 失败,因为 flash 是 Hash,而不是 FlashHash
【发布时间】:2013-01-01 08:46:49
【问题描述】:

给定一个功能测试,例如:

def test_exciting_rails_upgrades
    login(m=users(:manager))

    post :import_users_map_fields, :csv_file => fixture_file_upload('/users.csv', 'text/csv')
    assert flash.empty?
    flash.discard
    # other goodies omitted

end

在 Rails 2.3.2 中没有错误,但是在 2.3.15 中,错误是:

NoMethodError: {}:Hash 的未定义方法“丢弃” /test/functional/broken_upgrades.rb:119:in `test_exciting_rails_upgrades'

为什么flash 是Hash 类而不是FlashHash?

从源代码看来,2.3.2 和 2.3.15 ActionPack 文件 lib/action_controller/flash.rb 创建了 FlashHash 类并从 Hash 继承。但是,在 2.3.2 和 2.3.15 中的此功能测试中显示的是 Hash 类,而不是 HashFlash,因此不能对其调用 discard。

其他人可以使用 2.3.15 和 flash.discard 重现此错误吗?

【问题讨论】:

  • 可能是定义 ActionController::TestRequest#flash 的方式导致测试中出现此问题,但此代码在 2.3.2 和 2.3.15 中是相同的:def flash session['闪'] || {}结束

标签: ruby-on-rails hash actionpack rails-flash


【解决方案1】:

这里有两个测试用例可以用来证明 ActionController 会根据它是否已经设置来改变 'flash' 的类型。

在我的应用程序中,除非您已登录,否则您看不到 :index,因此在 test_flash_is_now_a_flashhash 中您会看到后端正确设置了 flash,而在 test_flash_is_a_plain_hash 中却没有。

def test_flash_is_a_plain_hash
  login(users(:permitted_user))
  get :index
  assert flash.instance_of?(Hash)
end

def test_flash_is_now_a_flashhash
  get :index
  assert_redirected_to :controller => "login"
  assert flash.instance_of?(ActionController::Flash::FlashHash)
end

您可以在 ActionController::TestRequest 代码中亲自看到这一点:

def flash
    session['flash'] || {}
end

更新:这是 Rails 分支 2-3-stable 中的 fixed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2020-10-27
    • 2012-10-10
    相关资源
    最近更新 更多