【问题标题】:No route matches {:action=>"show", :controller=>"spree/taxons", :id=>nil}没有路线匹配 {:action=>"show", :controller=>"spree/taxons", :id=>nil}
【发布时间】:2018-09-22 03:31:44
【问题描述】:

你好 RoR 程序员,

升级到 rails 5.1.5 后,我卡在自定义的 spree 应用程序代码中带来错误。

puma 记录了这个错误:

故障安全响应期间出错:没有路由匹配 {:action=>"show", :controller=>"spree/taxons", :id=>nil}, 可能不匹配 约束:[:id]
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/journey/formatter.rb:55:in generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/route_set.rb:748:in
generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/route_set.rb:779:in generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/routing-filter-0.6.1/lib/routing_filter/adapters/rails.rb:30:in
block in generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/routing-filter-0.6.1/lib/routing_filter/filters/locale.rb:70:in around_generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/routing-filter-0.6.1/lib/routing_filter/filter.rb:11:in
run'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/routing-filter-0.6.1/lib/routing_filter/chain.rb:15:in run'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/routing-filter-0.6.1/lib/routing_filter/adapters/rails.rb:29:in
generate'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/route_set.rb:826:in url_for'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/route_set.rb:277:in
call'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/route_set.rb:335:in block (2 levels) in define_url_helper'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/routes_proxy.rb:42:in
nested_taxons_path'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/actionpack-5.1.5/lib/action_dispatch/routing/routes_proxy.rb:45:in method_missing'
/root/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/spree_core-3.4.4/app/helpers/spree/base_helper.rb:79:in
seo_url'
/home/ypill/wuxu18/app/views/spree/frontend/ypill/_main_nav_bar.html.erb:16:in `_d16a1d9612a1846710427ba2d762257f'中的块(3级)

app/controllers/spree/taxons_controller.rb:

module Spree
  class TaxonsController < Spree::StoreController
    helper 'spree/products', 'spree/taxon_filters'

    respond_to :html

    def show
      @taxon = Taxon.friendly.find(params[:id])
      return unless @taxon

      @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))
      @products = @searcher.retrieve_products
      @taxonomies = Spree::Taxonomy.includes(root: :children)

spree/frontend/config/routes.rb:

  # route globbing for pretty nested taxon and product paths
  get '/t/*id', to: 'taxons#show', as: :nested_taxons

在 spree/core/app/helpers/spree/base_helper.rb 中:

def seo_url(taxon)
  spree.nested_taxons_path(taxon.permalink)
end

第 79 行:spree.nested_taxons_path(taxon.permalink) method_missing' or undefined methodpermalink' 为 nil:NilClass

自定义 _main_nav_bar.html.erb 文件代码,puma 从第 16、14、13、12 行记录错误:

<% @taxonomies ||= Spree::Taxonomy.includes(root: :children)  %>
<% max_level = Spree::Config[:max_level_in_taxons_menu] || 1 %>
<div class="navbar-header">
      <div class="container">
         <nav class="navbar" id="cssmenu">
          <ul class="navbar-nav">
            <li id="home-link"
            class="<%= ('active' if @page.nil? && @taxon.id == 12) unless @taxon.nil? %>"
              data-hook><%= link_to Spree.t(:home), spree.root_path %></li>

            <%#= @taxon.inspect %>
            <% @taxonomies.each do |taxonomy| %>
              <% cache [I18n.locale, taxonomy, max_level] do %>
                    <% taxonomy.root.children.each do |taxon| %>
                      <li class="<%= (taxon.id == @taxon.id ? 'active' : '') unless @taxon.nil? %>">
                        <%= link to taxon.name, seo_url(taxon) %>">
                        </a>
                      </li>
                    <% end %>
                <% end %>
            <% end %>
          </ul>

        </nav>

第 12 行:

<% @taxonomies.each do |taxonomy| %>

第 13 行:

<% cache [I18n.locale, taxonomy, max_level] do %>

第 14 行:

<% taxonomy.root.children.each do |taxon| %>

第 16 行

<%= link to taxon.name, seo_url(taxon) %>

在块(3 级)中,puma 将“seo_url”寻找到 spree_core-3.4.4/app/helpers/spree/base_helper.rb:79 缺少“spree.nested_taxons_path(taxon.permalink)”方法。

main_nav_bar.html.erb 在 Rails 4.2 上工作。

感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails spree-upgrade


    【解决方案1】:

    试试这条路线:

     get '/t/*id', to: 'spree/taxons#show', as: :nested_taxons
    

    【讨论】:

    • 它不能解决错误。实际错误可能是“方法缺失”或“未定义方法”,尽管 puma 记录了“无路由匹配”
    猜你喜欢
    • 2012-07-17
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多