Skip to main content

PDF Receipts not working

Rails • Asked by Adrian DeGus

I just finished working through the pdf receipts video but can't get it to work. I have the webhook working and all charges are displayed properly, but the link to the pdf 404's.

Can you see where I went wrong?

# config/initializers/stripe.rb

class RecordCharges
  def call(event)
    charge = event.data.object

    user = User.find_by(stripe_id: charge.customer)

    user.charges.create(
                    stripe_id: charge.id,
                    amount: charge.amount,
                    card_last4: charge.source.last4,
                    card_type: charge.source.brand,
                    card_exp_month: charge.source.exp_month,
                    card_exp_year: charge.source.exp_year
    )
  end
end

StripeEvent.configure do |events|
  events.subscribe 'charge.succeeded', RecordCharges.new
end


# charge.rb

belongs_to :user

def receipt
    Receipts::Receipt.new(
        id: id,
        product: "Nuvro",
        company: {
            name: "Nuvro LLC",
            address: "2040 S Alma School Rd Suite 1-484\nChandler, AZ 85286",
            email: "[email protected]",
            logo: Rails.root.join("app/assets/images/nuvro-50.png")
        },
        line_items: [
            ["Date",           created_at.strftime('%B' '%d,' '%Y')],
            ["Account Billed", "#{user.first_name} #{user.last_name} (#{user.email})"],
            ["Product",        "Nuvro"],
            ["Amount",         "$#{amount / 100}.00"],
            ["Charged to",     "#{card_type} (**** **** **** #{card_last4})"],
            ["Transaction ID", uuid]
        ]
    )
  end


    # user.rb

    has_many :charges


# charges_controller.rb

def show
    @charge = current_user.charges.find(params[:id])
    respond_to do |format|
      format.pdf {
        send_data @charge.receipt.render,
                  filename: "#{@charge.created_at.strftime("%m-%d-%Y")}-nuvro-receipt.pdf",
                  type: "application/pdf",
                  disposition: :inline
      }
    end
  end


    # routes.rb

    resource :charge # charges#show


    # views/companies/edit.html.erb

    <% current_user.charges.each do |charge| %>
    ....
    <%= link_to "View Receipt", charge_path(@charge, format: :pdf) %>

    ...
    <%= link_to "View Receipt", charge_path(charge, format: :pdf) %> # tried this, didn't work

I'm missing something obvious, I just know it :)


If the link is 404ing, then you either don't have routes, or your links are wrong. They should look something like this:

# config/routes.rb
resources :charges
<% current_user.charges.each do |charge| %>
    <%= link_to "View Receipt", charge_path(charge, format: :pdf) %> # tried this, didn't work
<% end %>

When I used resources :charges in my routes it threw an exception due to the lack of a charge ID. It's because of this that I changed my route to resource :charge


Well your snippet there was using @charge which would cause that because you didn't set the charge variable (and you can't since the user has multiple charges. You want resources plural because there are many charges and the user should be able to view each charge and the ID needs to be passed in to the charge_path. If you use both those that I mentioned you should be good.


That did the trick!


Login or Create An Account to join the conversation.

Subscribe to the newsletter

Join 24,647+ developers who get early access to new screencasts, articles, guides, updates, and more.

    By clicking this button, you agree to the GoRails Terms of Service and Privacy Policy.

    More of a social being? We're also on Twitter and YouTube.