I am building a spree shop into an exiting Rails application, and I need to access link_to_cart
from outside of the Spree engine.
link_to_cart
can be found here: spree/core/app/helpers/spree/base_helper.rb
Since I have modified the styling in link_to_cart
, I also created:
#helpers/spree/base_helper_decorator.rb
module Spree
module BaseHelper
def link_to_cart(text = nil)
text = text ? h(text) : Spree.t('cart')
css_class = nil
if simple_current_order.nil? or simple_current_order.item_count.zero?
text = "#{text}: (#{Spree.t('empty')})"
css_class = 'empty'
else
text = "<i class='fa fa-shopping-cart'></i> #{text}: (#{simple_current_order.item_count}) <span class='amount'>#{simple_current_order.display_total.to_html}</span>".html_safe
css_class = 'full'
end
link_to text.html_safe, spree.cart_path, :class => "cart-info #{css_class} btn btn-small btn-success pull-right", style: "margin-left:10px;"
end
end
end
I have tried doing stuff like Spree::BaseHelper.link_to_cart outside of the engine, but I keep getting undefined local variable or method 'link_to_cart'
I found this on a different StackOverflow question, and it seems promising, but I'm not sure how to modify it for my needs:
module MyEngine
class Engine < Rails::Engine
initializer 'my_engine.action_controller' do |app|
ActiveSupport.on_load :action_controller do
helper MyEngine::ImportantHelper
end
end
end
end
Ok, thanks Ben for getting me on the right track. Here was my solution:
# class ApplicationController < ActionController::Base
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::Auth
helper Spree::BaseHelper
helper Spree::StoreHelper
Update
I ran into an issue with current_store
being undefined outside of the engine. I'm not sure how to solve this properly, but in the meantime I've just added the following to stop spree from calling current_store:
module Spree
module Core
module ControllerHelpers
module Order
def current_order_params
{ currency: current_currency, guest_token: cookies.signed[:guest_token], store_id: Spree::Store.first, user_id: try_spree_current_user.try(:id) }
end
end
end
end
end
Also helper Spree::StoreHelper
seems to no longer be required to display the cart button and current orders..
There have been some updates since Abram left his answer. It got me on the right track but I had a few hiccups. The main one was current_currency
being undefined.
application_controller.rb
class ApplicationController < ActionController::Base
include Spree::Core::ControllerHelpers::Order
include Spree::Core::ControllerHelpers::Auth
include Spree::Core::ControllerHelpers::Store
include Spree::Core::ControllerHelpers::Common
helper Spree::BaseHelper
I overrode the Spree navbar and used the one for my main app.
It started working when I added include Spree::Core::ControllerHelpers::Common
. Unfortunately, this renders all views through the spree spree_application.html.erb
layout. You may have to override and tinker a bit with this view.
Also, all of the css comes from spree at this point. You'll have to move your custom css into the spree namespace and @import it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With