draper icon indicating copy to clipboard operation
draper copied to clipboard

Path Helpers Failing when email is sent before call (CCI)

Open benlieb opened this issue 4 years ago • 3 comments

I have a feature spec that calls

visit company.decorate.h.new_company_path

This works as expected on my local machine but fails in Circle CI with:

NoMethodError:
undefined method `new_company_path' for #<#<Class:0x00007f0ce1116710>:0x00007f0ce5926f28>
Did you mean?  new_company_url

Is there a reason this would fail in Circle CI but not locally? This is the only spec out of about 150 that is failing, so I'm not inclined to think it's a general configuration issue.

For full context here is the whole spec. Is it because there isn't a view context yet, with nothing yet rendered? If so why does this work locally but not on CCI?

  describe 'Contact Details Panel' do
    specify 'errors show where they belong when the data is bad' do
      company = create :company
      visit company.decorate.h.new_company_path

      find('.sticky-entity-header .btn', text: /save/i).click
      expect_async_user_message("couldn't be saved", :danger)
      expect(find('.help-block.warning-for-company-name').text).to include("can't be blank")
    end
  end

benlieb avatar Mar 27 '20 03:03 benlieb

Does that feature send out an email before this failure? We are seeing a similar issue and this seems to happen because an email is sent out first. This causes the view context to switch to the Mailer, but it does not appear to switch back to the controller. This means that the view context is now used on a controller context, leading to this error (because Mailers only have fully qualified URLs).

graaff avatar Jul 29 '20 05:07 graaff

@graaff we are also seeing an error when when using Draper after ActionMailer where Draper can no longer find methods defined in helpers. Did you end up with any fix or work-around?

prognostikos avatar Sep 21 '21 11:09 prognostikos

For anyone else running into this a workaround is to include the missing helper(s) in your ApplicationMailer so they're available to Draper, etc. even after ActionMailer switches the view context.

prognostikos avatar Sep 21 '21 11:09 prognostikos