首页 > 解决方案 > 为什么单击已部署代码上的特定链接时会出现 500 错误?

问题描述

当我在远程服务器上正在运行的应用程序上点击特定端点时,我得到 500 Internal Error。然而,代码在我的本地系统/服务器上运行良好。

代码:

order_controller.rb

module Admin
  module Statistic
    class OrdersController < BaseController
      def show
        @orders_grid = ::Statistic::OrdersGrid.new(params[:statistic_orders_grid])
        @assets = @orders_grid.assets
        @paginated_assets = @assets.page(params[:page]).per(20)

        fee_sums_per_currency = {}
        @assets.each do |order|
          fee_currency = order.get_order_fee_currency
          unless fee_sums_per_currency.key?(fee_currency)
            fee_sums_per_currency[fee_currency] = 0
          end
          fee_sums_per_currency[fee_currency] += order.fee
        end
        fee_summary = []
        fee_sums_per_currency.each do |currency, fee_sum|
          fee_summary << "#{ currency } #{ fee_sum }"
        end

        @summary = {
          :count => @assets.length,
          :fee_summary => fee_summary.join(",  ")
        }
        @order_reset_button = true
      end
    end
  end
end

意见/管理/统计/订单/show.html.slim

.row
  = render "admin/statistic/shared/filter_panel", form_target: @orders_grid, url: admin_statistic_orders_path
.row
  = render "admin/statistic/shared/summary_panel", groups: @assets

.row
  .panel.panel-primary
    .panel-heading
      span = t('admin_header.orders')
    .panel-body
      = datagrid_table(@orders_grid, @paginated_assets)

共享文件

管理/统计/共享/filter_panel

.panel.panel-primary
  .panel-heading
    h4.panel-title = t('admin.statistic.filter')

  .panel-body
    = form_for form_target, url: url, html: {method: :get, class: 'form-horizontal'} do |f|
      .row
        .col.col-xs-3
          = f.datagrid_label :currency
          = f.datagrid_filter :currency, class: "form-control"
        .col.col-xs-3
          = f.datagrid_label :state
          = f.datagrid_filter :state, class: "form-control"
        .col.col-xs-3
          = f.datagrid_label :type
          = f.datagrid_filter :type, class: "form-control"
        .col.col-xs-6
          = f.datagrid_label :created_at
          .form-inline
            = f.datagrid_filter :created_at, class: "form-control"
        .col.col-xs-2
          br.heighten-br
          = f.submit t('datagrid.form.submit'), class: "btn btn-primary", style: "width: 100%"
        .col.col-xs-2
          br.heighten-br
          = link_to t('datagrid.form.clear'), {:controller => 'admin/statistic/orders', :action => 'show'}, class: 'btn btn-primary', style: "width: 100%"

管理/统计/共享/summary_panel

.panel.panel-default
  .panel-heading
    h4.panel-title.row
      a data-parent="#filter-accordion" data-toggle="collapse" href="#summary"
        span.col-xs-8.text-muted = t('admin.statistic.summary')
        span.col-xs-4.text-right.text-muted = t('admin.statistic.click-to-expand')
  #summary.panel-collapse.collapse
    .panel-body
      .datagrid-groups
        - if groups
          - groups.each do |key, val|
            .datagrid.group.row
              span.col-xs-2.title = t("admin.statistic.#{controller_name}.#{controller.action_name}.#{key}")
              span.col-xs-10.value = val

导航栏 基于cancancan

- if can? :menu, Trade
            li.dropdown class = check_active('withdraws')
              = link_to 'javascript:;', class: 'dropdown-toggle', 'data-toggle' => 'dropdown' do
                span = t('admin_header.trades')
                span.caret
              ul.dropdown-menu
                - if can? :manage, Order
                  li class = check_active('orders')
                    = link_to t(".menus.items.operating.orders"), admin_statistic_orders_path

能力.rb

module Admin
  class Ability
    include CanCan::Ability

    def initialize(user)
      return unless user.admin?

      can :read, Order
      can :read, Trade
      can :read, Proof
      can :update, Proof
      can :manage, Document
      can :manage, Member
      can :manage, Ticket
      can :manage, IdDocument
      can :manage, TwoFactor
      can :manage, Coupon
      can :manage, Order
      can :manage, Trade
      can :manage, Revenue

      can :menu, Deposit
      can :menu, Trade
    end
  end
end

配置/路由/admin.rb

namespace :admin do
namespace :statistic do
    resource :orders, :only => :show
    resource :trades, :only => :show
  end
end

我已经检查过并且不知道在开发服务器上而不是在远程服务器上工作时缺少什么。

标签: ruby-on-railsrubyvpscancancan

解决方案


所以我发现问题出在ability.rbOrder没有在ability.rb我的引用中定义为:menu.

所以我不得不在ability.rb中定义它

module Admin
  class Ability
    include CanCan::Ability

    def initialize(user)
      return unless user.admin?

      can :read, Order
      can :read, Trade
      can :read, Proof
      can :update, Proof
      can :manage, Document
      can :manage, Member
      can :manage, Ticket
      can :manage, IdDocument
      can :manage, TwoFactor
      can :manage, Coupon
      can :manage, Order
      can :manage, Trade
      can :manage, Revenue

      can :menu, Deposit
      can :menu, Trade
      can :menu, Order # So I added this for `Order` to be references as `:menu` by admin.
    end
  end
end

然后在我由 Cancancan 驱动的导航栏中,我在if语句中添加了 Order

- if can? :menu, Trade || Order # So I added this as well.
            li.dropdown class = check_active('withdraws')
              = link_to 'javascript:;', class: 'dropdown-toggle', 'data-toggle' => 'dropdown' do
                span = t('admin_header.trades')
                span.caret
              ul.dropdown-menu
                - if can? :manage, Order
                  li class = check_active('orders')
                    = link_to t(".menus.items.operating.orders"), admin_statistic_orders_path

推荐阅读