Trailblazer建议像这样注入current_user
细胞
<%= concept(Appointment::Cell::UserStatus,user,current_user: current_user) %>
然后可以使用一种方法使其在单元格内可访问
def current_user
options[:current_user]
end
但是,这意味着在每次调用单元格时添加此注入,而实际上current_user
是一个特殊的全局变量。
我已经设法current_user
通过创建一个超类单元来解决注入问题,如下所示:
class Template::Cell < Cell::Concept
include Pundit
include Devise::Controllers::Helpers
Devise::Controllers::Helpers.define_helpers(Devise::Mapping.new(:user, {}))
include Escaped
include ActionView::Helpers::JavaScriptHelper
end
这很好用,除了我无法在 RSpec 测试期间登录用户。通常的基于控制器的方法不起作用,因为无法访问请求。
顺便说一句,我尝试了“设计模拟”解决方案,但没有奏效:
RSpec.describe Friendship::Cell, type: :cell do
include Devise::TestHelpers
include ControllerHelpers
let!(:user) { create :user }
describe '#methods' do
before do
sign_in(user)
end
subject { concept(described_class, user, current_user: user) }
it { expect(current_user).to eq(user) }
end
end
module ControllerHelpers
def sign_in(user = double('user'))
if user.nil?
allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, {:scope => :user})
allow(controller).to receive(:current_user).and_return(nil)
else
allow(request.env['warden']).to receive(:authenticate!).and_return(user)
allow(controller).to receive(:current_user).and_return(user)
end
end
end
错误
1) Friendship::Cell cell can be instantiated
Failure/Error: @request.env['action_controller.instance'] = @controller
NoMethodError:
undefined method `env' for nil:NilClass
# /Users/sean/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/devise-4.3.0/lib/devise/test/controller_helpers.rb:40:in `setup_controller_for_warden'
# /Users/sean/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/rspec-rails-3.6.0/lib/rspec/rails/adapters.rb:165:in `block (2 levels) in setup'