solidus_frontend 1.2.3 → 1.3.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_frontend might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +3 -3
- data/Rakefile +1 -1
- data/app/assets/javascripts/spree/frontend/checkout/address.js.coffee +0 -2
- data/app/assets/stylesheets/spree/frontend.css +1 -2
- data/app/assets/stylesheets/spree/frontend/_skeleton.scss +242 -0
- data/app/assets/stylesheets/spree/frontend/screen.css.scss +1 -0
- data/app/controllers/spree/checkout_controller.rb +93 -93
- data/app/controllers/spree/content_controller.rb +1 -1
- data/app/controllers/spree/orders_controller.rb +15 -16
- data/app/controllers/spree/products_controller.rb +19 -18
- data/app/controllers/spree/store_controller.rb +27 -27
- data/app/controllers/spree/taxons_controller.rb +1 -2
- data/app/models/spree/frontend_configuration.rb +1 -1
- data/app/views/spree/address/_form.html.erb +18 -12
- data/app/views/spree/orders/show.html.erb +2 -2
- data/app/views/spree/products/_cart_form.html.erb +5 -5
- data/app/views/spree/products/show.html.erb +1 -1
- data/app/views/spree/shared/_google_analytics.html.erb +1 -1
- data/app/views/spree/shared/_order_details.html.erb +12 -11
- data/app/views/spree/shared/_products.html.erb +2 -2
- data/config/initializers/assets.rb +8 -1
- data/config/initializers/canonical_rails.rb +1 -2
- data/config/routes.rb +17 -18
- data/lib/spree/frontend.rb +1 -0
- data/lib/spree/frontend/engine.rb +1 -9
- data/lib/spree/frontend/middleware/seo_assist.rb +3 -4
- data/lib/tasks/rake_util.rb +3 -6
- data/lib/tasks/taxon.rake +3 -3
- data/script/rails +0 -1
- data/solidus_frontend.gemspec +1 -0
- data/spec/controllers/controller_extension_spec.rb +15 -15
- data/spec/controllers/controller_helpers_spec.rb +1 -2
- data/spec/controllers/spree/checkout_controller_spec.rb +67 -115
- data/spec/controllers/spree/content_controller_spec.rb +1 -1
- data/spec/controllers/spree/current_order_tracking_spec.rb +7 -6
- data/spec/controllers/spree/home_controller_spec.rb +3 -3
- data/spec/controllers/spree/orders_controller_ability_spec.rb +17 -16
- data/spec/controllers/spree/orders_controller_spec.rb +9 -8
- data/spec/controllers/spree/orders_controller_transitions_spec.rb +5 -5
- data/spec/controllers/spree/products_controller_spec.rb +10 -11
- data/spec/controllers/spree/taxons_controller_spec.rb +5 -5
- data/spec/features/address_spec.rb +15 -15
- data/spec/features/automatic_promotion_adjustments_spec.rb +18 -18
- data/spec/features/caching/products_spec.rb +2 -2
- data/spec/features/caching/taxons_spec.rb +2 -2
- data/spec/features/cart_spec.rb +8 -6
- data/spec/features/checkout_spec.rb +49 -51
- data/spec/features/checkout_unshippable_spec.rb +4 -5
- data/spec/features/coupon_code_spec.rb +28 -30
- data/spec/features/currency_spec.rb +3 -3
- data/spec/features/free_shipping_promotions_spec.rb +17 -17
- data/spec/features/locale_spec.rb +33 -24
- data/spec/features/order_spec.rb +4 -4
- data/spec/features/products_spec.rb +12 -12
- data/spec/features/promotion_code_invalidation_spec.rb +1 -0
- data/spec/features/quantity_promotions_spec.rb +1 -1
- data/spec/features/taxons_spec.rb +16 -16
- data/spec/features/template_rendering_spec.rb +1 -2
- data/spec/helpers/base_helper_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -5
- data/spec/support/shared_contexts/checkout_setup.rb +1 -0
- data/spec/support/shared_contexts/custom_products.rb +18 -17
- data/spec/support/shared_contexts/product_prototypes.rb +3 -5
- data/spec/views/spree/checkout/_summary_spec.rb +2 -2
- metadata +24 -9
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class OrdersController < Spree::StoreController
|
3
3
|
before_action :check_authorization
|
4
|
-
rescue_from ActiveRecord::RecordNotFound, :
|
4
|
+
rescue_from ActiveRecord::RecordNotFound, with: :render_404
|
5
5
|
helper 'spree/products', 'spree/orders'
|
6
6
|
|
7
7
|
respond_to :html
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
if @order.contents.update_cart(order_params)
|
21
21
|
respond_with(@order) do |format|
|
22
22
|
format.html do
|
23
|
-
if params.
|
23
|
+
if params.key?(:checkout)
|
24
24
|
@order.next if @order.cart?
|
25
25
|
redirect_to checkout_state_path(@order.checkout_steps.first)
|
26
26
|
else
|
@@ -76,7 +76,7 @@ module Spree
|
|
76
76
|
|
77
77
|
def accurate_title
|
78
78
|
if @order && @order.completed?
|
79
|
-
Spree.t(:order_number, :
|
79
|
+
Spree.t(:order_number, number: @order.number)
|
80
80
|
else
|
81
81
|
Spree.t(:shopping_cart)
|
82
82
|
end
|
@@ -95,21 +95,20 @@ module Spree
|
|
95
95
|
|
96
96
|
private
|
97
97
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
98
|
+
def order_params
|
99
|
+
if params[:order]
|
100
|
+
params[:order].permit(*permitted_order_attributes)
|
101
|
+
else
|
102
|
+
{}
|
104
103
|
end
|
104
|
+
end
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
end
|
106
|
+
def assign_order
|
107
|
+
@order = current_order
|
108
|
+
unless @order
|
109
|
+
flash[:error] = Spree.t(:order_not_found)
|
110
|
+
redirect_to(root_path) && return
|
112
111
|
end
|
113
|
-
|
112
|
+
end
|
114
113
|
end
|
115
114
|
end
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
before_action :load_product, only: :show
|
4
4
|
before_action :load_taxon, only: :index
|
5
5
|
|
6
|
-
rescue_from ActiveRecord::RecordNotFound, :
|
6
|
+
rescue_from ActiveRecord::RecordNotFound, with: :render_404
|
7
7
|
helper 'spree/taxons'
|
8
8
|
|
9
9
|
respond_to :html
|
@@ -15,31 +15,32 @@ module Spree
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def show
|
18
|
-
@variants = @product.variants_including_master.
|
18
|
+
@variants = @product.variants_including_master.with_prices(current_pricing_options).includes([:option_values, :images])
|
19
19
|
@product_properties = @product.product_properties.includes(:property)
|
20
20
|
@taxon = Spree::Taxon.find(params[:taxon_id]) if params[:taxon_id]
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
24
|
-
def accurate_title
|
25
|
-
if @product
|
26
|
-
@product.meta_title.blank? ? @product.name : @product.meta_title
|
27
|
-
else
|
28
|
-
super
|
29
|
-
end
|
30
|
-
end
|
31
24
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
@product = @products.friendly.find(params[:id])
|
25
|
+
def accurate_title
|
26
|
+
if @product
|
27
|
+
@product.meta_title.blank? ? @product.name : @product.meta_title
|
28
|
+
else
|
29
|
+
super
|
39
30
|
end
|
31
|
+
end
|
40
32
|
|
41
|
-
|
42
|
-
|
33
|
+
def load_product
|
34
|
+
if try_spree_current_user.try(:has_spree_role?, "admin")
|
35
|
+
@products = Product.with_deleted
|
36
|
+
else
|
37
|
+
@products = Product.available
|
43
38
|
end
|
39
|
+
@product = @products.friendly.find(params[:id])
|
40
|
+
end
|
41
|
+
|
42
|
+
def load_taxon
|
43
|
+
@taxon = Spree::Taxon.find(params[:taxon]) if params[:taxon].present?
|
44
|
+
end
|
44
45
|
end
|
45
46
|
end
|
@@ -1,48 +1,48 @@
|
|
1
1
|
module Spree
|
2
2
|
class StoreController < Spree::BaseController
|
3
|
+
include Spree::Core::ControllerHelpers::Pricing
|
3
4
|
include Spree::Core::ControllerHelpers::Order
|
4
5
|
|
5
6
|
skip_before_action :set_current_order, only: :cart_link
|
6
7
|
|
7
8
|
def unauthorized
|
8
|
-
render 'spree/shared/unauthorized', :
|
9
|
+
render 'spree/shared/unauthorized', layout: Spree::Config[:layout], status: 401
|
9
10
|
end
|
10
11
|
|
11
12
|
def cart_link
|
12
|
-
render :
|
13
|
+
render partial: 'spree/shared/link_to_cart'
|
13
14
|
fresh_when(simple_current_order)
|
14
15
|
end
|
15
16
|
|
16
17
|
private
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
19
|
+
# This method is placed here so that the CheckoutController
|
20
|
+
# and OrdersController can both reference it (or any other controller
|
21
|
+
# which needs it)
|
22
|
+
def apply_coupon_code
|
23
|
+
if params[:order] && params[:order][:coupon_code]
|
24
|
+
@order.coupon_code = params[:order][:coupon_code]
|
25
|
+
|
26
|
+
handler = PromotionHandler::Coupon.new(@order).apply
|
27
|
+
|
28
|
+
if handler.error.present?
|
29
|
+
flash.now[:error] = handler.error
|
30
|
+
respond_with(@order) { |format| format.html { render :edit } } && return
|
31
|
+
elsif handler.success
|
32
|
+
flash[:success] = handler.success
|
33
33
|
end
|
34
34
|
end
|
35
|
+
end
|
35
36
|
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
def config_locale
|
38
|
+
Spree::Frontend::Config[:locale]
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
def lock_order
|
42
|
+
OrderMutex.with_lock!(@order) { yield }
|
43
|
+
rescue Spree::OrderMutex::LockFailed
|
44
|
+
flash[:error] = Spree.t(:order_mutex_error)
|
45
|
+
redirect_to spree.cart_path
|
46
|
+
end
|
46
47
|
end
|
47
48
|
end
|
48
|
-
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
class TaxonsController < Spree::StoreController
|
3
|
-
rescue_from ActiveRecord::RecordNotFound, :
|
3
|
+
rescue_from ActiveRecord::RecordNotFound, with: :render_404
|
4
4
|
helper 'spree/products'
|
5
5
|
|
6
6
|
respond_to :html
|
@@ -23,6 +23,5 @@ module Spree
|
|
23
23
|
super
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
27
26
|
end
|
28
27
|
end
|
@@ -39,19 +39,25 @@
|
|
39
39
|
<%= form.label :state, Spree.t(:state) %><span class='required' id=<%="#{address_id}state-required"%>>*</span><br/>
|
40
40
|
|
41
41
|
<span class="js-address-fields" style="display: none;">
|
42
|
-
<%=
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
42
|
+
<%=
|
43
|
+
form.collection_select(
|
44
|
+
:state_id, address.country.states, :id, :name,
|
45
|
+
{:include_blank => true},
|
46
|
+
{
|
47
|
+
class: have_states ? 'required' : '',
|
48
|
+
style: have_states ? '' : 'display: none;',
|
49
|
+
disabled: !have_states
|
50
|
+
})
|
51
|
+
%>
|
52
|
+
<%=
|
53
|
+
form.text_field(
|
54
|
+
:state_name,
|
55
|
+
class: !have_states ? 'required' : '',
|
56
|
+
style: have_states ? 'display: none;' : '',
|
57
|
+
disabled: have_states
|
58
|
+
)
|
59
|
+
%>
|
53
60
|
</span>
|
54
|
-
|
55
61
|
<noscript>
|
56
62
|
<%= form.text_field :state_name, :class => 'required' %>
|
57
63
|
</noscript>
|
@@ -13,8 +13,8 @@
|
|
13
13
|
<p data-hook="links">
|
14
14
|
<%= link_to Spree.t(:back_to_store), spree.root_path, :class => "button" %>
|
15
15
|
<% unless order_just_completed?(@order) %>
|
16
|
-
<% if try_spree_current_user && respond_to?(:
|
17
|
-
<%= link_to Spree.t(:my_account),
|
16
|
+
<% if try_spree_current_user && respond_to?(:account_path) %>
|
17
|
+
<%= link_to Spree.t(:my_account), spree.account_path, :class => "button" %>
|
18
18
|
<% end %>
|
19
19
|
<% end %>
|
20
20
|
</p>
|
@@ -1,13 +1,13 @@
|
|
1
1
|
<%= form_for :order, :url => populate_orders_path do |f| %>
|
2
2
|
<div id="inside-product-cart-form" data-hook="inside_product_cart_form" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
|
3
3
|
|
4
|
-
<% if @product.
|
4
|
+
<% if @product.variants_and_option_values_for(current_pricing_options).any? %>
|
5
5
|
<div id="product-variants" class="columns five alpha">
|
6
6
|
<h6 class="product-section-title"><%= Spree.t(:variants) %></h6>
|
7
7
|
<ul>
|
8
|
-
<% @product.
|
8
|
+
<% @product.variants_and_option_values_for(current_pricing_options).each_with_index do |variant, index| %>
|
9
9
|
<li>
|
10
|
-
<%= radio_button_tag "variant_id", variant.id, index == 0, 'data-price' => variant.
|
10
|
+
<%= radio_button_tag "variant_id", variant.id, index == 0, 'data-price' => variant.price_for(current_pricing_options) %>
|
11
11
|
<%= label_tag "variant_id_#{ variant.id }" do %>
|
12
12
|
<span class="variant-description">
|
13
13
|
<%= variant_options variant %>
|
@@ -28,7 +28,7 @@
|
|
28
28
|
<%= hidden_field_tag "variant_id", @product.master.id %>
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
<% if @product.
|
31
|
+
<% if @product.price_for(current_pricing_options) and !@product.price.nil? %>
|
32
32
|
<div data-hook="product_price" class="columns five <% if !@product.has_variants? %> alpha <% else %> omega <% end %>">
|
33
33
|
|
34
34
|
<div id="product-price">
|
@@ -37,7 +37,7 @@
|
|
37
37
|
<span class="price selling" itemprop="price">
|
38
38
|
<%= display_price(@product) %>
|
39
39
|
</span>
|
40
|
-
<span itemprop="priceCurrency" content="<%=
|
40
|
+
<span itemprop="priceCurrency" content="<%= current_pricing_options.currency %>"></span>
|
41
41
|
</div>
|
42
42
|
|
43
43
|
<% if @product.master.can_supply? %>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
'revenue': '<%= @order.total %>', // Grand Total.
|
19
19
|
'shipping': '<%= @order.ship_total %>', // Shipping.
|
20
20
|
'tax': '<%= @order.tax_total %>', // Tax.
|
21
|
-
'currency': '<%=
|
21
|
+
'currency': '<%= @order.currency %>' // local currency code.
|
22
22
|
});
|
23
23
|
<% @order.line_items.each do |line_item| %>
|
24
24
|
ga('ecommerce:addItem', {
|
@@ -3,18 +3,18 @@
|
|
3
3
|
<% if order.has_step?("address") %>
|
4
4
|
|
5
5
|
<div class="columns alpha four" data-hook="order-bill-address">
|
6
|
-
<h6><%= Spree.t(:billing_address) %> <%= link_to "(#{Spree.t(
|
6
|
+
<h6><%= Spree.t(:billing_address) %> <%= link_to "(#{Spree.t('actions.edit')})", checkout_state_path(:address) unless order.completed? %></h6>
|
7
7
|
<%= render :partial => 'spree/shared/address', :locals => { :address => order.bill_address } %>
|
8
8
|
</div>
|
9
9
|
|
10
10
|
<% if order.has_step?("delivery") %>
|
11
11
|
<div class="columns alpha four" data-hook="order-ship-address">
|
12
|
-
<h6><%= Spree.t(:shipping_address) %> <%= link_to "(#{Spree.t(
|
12
|
+
<h6><%= Spree.t(:shipping_address) %> <%= link_to "(#{Spree.t('actions.edit')})", checkout_state_path(:address) unless order.completed? %></h6>
|
13
13
|
<%= render :partial => 'spree/shared/address', :locals => { :address => order.ship_address } %>
|
14
14
|
</div>
|
15
15
|
|
16
16
|
<div class="columns alpha four" data-hook="order-shipment">
|
17
|
-
<h6><%= Spree.t(:shipments) %> <%= link_to "(#{Spree.t(
|
17
|
+
<h6><%= Spree.t(:shipments) %> <%= link_to "(#{Spree.t('actions.edit')})", checkout_state_path(:delivery) unless order.completed? %></h6>
|
18
18
|
<div class="delivery">
|
19
19
|
<% order.shipments.each do |shipment| %>
|
20
20
|
<div>
|
@@ -28,15 +28,16 @@
|
|
28
28
|
<% end %>
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
|
32
|
-
<
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
<% if order.has_step?("payment") %>
|
32
|
+
<div class="columns omega four">
|
33
|
+
<h6><%= Spree.t(:payment_information) %> <%= link_to "(#{Spree.t('actions.edit')})", checkout_state_path(:payment) unless order.completed? %></h6>
|
34
|
+
<div class="payment-info">
|
35
|
+
<% order.payments.valid.each do |payment| %>
|
36
|
+
<%= render payment %><br/>
|
37
|
+
<% end %>
|
38
|
+
</div>
|
37
39
|
</div>
|
38
|
-
|
39
|
-
|
40
|
+
<% end %>
|
40
41
|
</div>
|
41
42
|
|
42
43
|
<hr />
|
@@ -26,13 +26,13 @@
|
|
26
26
|
<% products.each do |product| %>
|
27
27
|
<% url = spree.product_path(product, taxon_id: @taxon.try(:id)) %>
|
28
28
|
<li id="product_<%= product.id %>" class="columns three <%= cycle("alpha", "secondary", "", "omega secondary", name: "classes") %>" data-hook="products_list_item" itemscope itemtype="http://schema.org/Product">
|
29
|
-
<% cache(@taxon.present? ? [I18n.locale,
|
29
|
+
<% cache(@taxon.present? ? [I18n.locale, current_pricing_options, @taxon, product] : [I18n.locale, current_pricing_options, product]) do %>
|
30
30
|
<div class="product-image">
|
31
31
|
<%= link_to image_tag(product.display_image.attachment(:small), itemprop: "image"), url, itemprop: 'url' %>
|
32
32
|
</div>
|
33
33
|
<%= link_to truncate(product.name, length: 50), url, class: 'info', itemprop: "name", title: product.name %>
|
34
34
|
<span itemprop="offers" itemscope itemtype="http://schema.org/Offer">
|
35
|
-
<span class="price selling" itemprop="price"><%= display_price(product)
|
35
|
+
<span class="price selling" itemprop="price"><%= display_price(product) %></span>
|
36
36
|
</span>
|
37
37
|
<% end %>
|
38
38
|
</li>
|
@@ -1 +1,8 @@
|
|
1
|
-
Rails.application.config.assets.precompile += %w
|
1
|
+
Rails.application.config.assets.precompile += %w[
|
2
|
+
spree/frontend/all*
|
3
|
+
jquery.validate/localization/messages_*
|
4
|
+
favicon.ico
|
5
|
+
spree/frontend/cart.png
|
6
|
+
credit_cards/*
|
7
|
+
icons/delete.png
|
8
|
+
]
|
@@ -5,11 +5,10 @@ CanonicalRails.setup do |config|
|
|
5
5
|
#
|
6
6
|
# Acts as a whitelist for routes to have trailing slashes
|
7
7
|
|
8
|
-
config.collection_actions# = [:index]
|
8
|
+
config.collection_actions # = [:index]
|
9
9
|
|
10
10
|
# Parameter spamming can cause index dilution by creating seemingly different URLs with identical or near-identical content.
|
11
11
|
# Unless whitelisted, these parameters will be omitted
|
12
12
|
|
13
13
|
config.whitelisted_parameters = [:keywords, :page, :search, :taxon]
|
14
|
-
|
15
14
|
end
|
data/config/routes.rb
CHANGED
@@ -1,36 +1,35 @@
|
|
1
1
|
Spree::Core::Engine.add_routes do
|
2
|
+
root to: 'home#index'
|
2
3
|
|
3
|
-
|
4
|
+
resources :products, only: [:index, :show]
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
get '/locale/set', :to => 'locale#set'
|
6
|
+
get '/locale/set', to: 'locale#set'
|
8
7
|
|
9
8
|
# non-restful checkout stuff
|
10
|
-
patch '/checkout/update/:state', :
|
11
|
-
get '/checkout/:state', :
|
12
|
-
get '/checkout', :
|
9
|
+
patch '/checkout/update/:state', to: 'checkout#update', as: :update_checkout
|
10
|
+
get '/checkout/:state', to: 'checkout#edit', as: :checkout_state
|
11
|
+
get '/checkout', to: 'checkout#edit', as: :checkout
|
13
12
|
|
14
|
-
populate_redirect = redirect do |
|
13
|
+
populate_redirect = redirect do |_params, request|
|
15
14
|
request.flash[:error] = Spree.t(:populate_get_error)
|
16
15
|
request.referer || '/cart'
|
17
16
|
end
|
18
17
|
|
19
|
-
get '/orders/populate', :
|
18
|
+
get '/orders/populate', to: populate_redirect
|
20
19
|
get '/orders/:id/token/:token' => 'orders#show', :as => :token_order
|
21
20
|
|
22
|
-
resources :orders, :
|
23
|
-
post :populate, :
|
21
|
+
resources :orders, except: [:index, :new, :create, :destroy] do
|
22
|
+
post :populate, on: :collection
|
24
23
|
end
|
25
24
|
|
26
|
-
get '/cart', :
|
27
|
-
patch '/cart', :
|
28
|
-
put '/cart/empty', :
|
25
|
+
get '/cart', to: 'orders#edit', as: :cart
|
26
|
+
patch '/cart', to: 'orders#update', as: :update_cart
|
27
|
+
put '/cart/empty', to: 'orders#empty', as: :empty_cart
|
29
28
|
|
30
29
|
# route globbing for pretty nested taxon and product paths
|
31
|
-
get '/t/*id', :
|
30
|
+
get '/t/*id', to: 'taxons#show', as: :nested_taxons
|
32
31
|
|
33
|
-
get '/unauthorized', :
|
34
|
-
get '/content/cvv', :
|
35
|
-
get '/cart_link', :
|
32
|
+
get '/unauthorized', to: 'home#unauthorized', as: :unauthorized
|
33
|
+
get '/content/cvv', to: 'content#cvv', as: :cvv
|
34
|
+
get '/cart_link', to: 'store#cart_link', as: :cart_link
|
36
35
|
end
|