【问题标题】:Rails 4 routing issue, or something else; I am not sure at this pointRails 4 路由问题,或其他问题;我现在不确定
【发布时间】:2015-07-30 07:38:34
【问题描述】:

好的,这些仪表板页面最初是在我尝试在使用脚手架生成的主控制器中呈现它们时工作的。我选择尝试将它们拆分为自己的控制器。我从另一个应用程序中复制了大部分内容,但它是 rails 3,我使用的是 rails 4。此外,我只有一个模型 order.rb,用于生成图表的查询所在的位置。

Routes.rb:

Rails.application.routes.draw do
  resources :orders do   
    collection do
      get :search, as: 'search'
    end
  end

  namespace :dashboards do
    get 'chart_needby_monthly'
    get 'chart_total_orders_by_qty'
    get 'chart_qty_monthly'
  end

  root 'orders#landing'
end

控制器:

class DashboardsController < ApplicationController

  def chart_needby_monthly
    logger.info 'I’m inside the controller function, the value of params is: #{params([:dyear])}'

    year = ((params[:dyear]).gsub(/\D/,'')

    logger.info 'After assignmnet,  dyear is: #{dyear}'

    @chart_data_one = Order.search_one(year)
  end

  def chart_total_orders_by_qty
    @chart_data_two = Order.search_two(year)
  end

  def chart_qty_monthly    
    @chart_data_three = Order.search_three(year)
  end

  private 
    def chart_needby_monthly_params
      params.require(:dyear)
    end
end

chart_needby_monthly.html.erb

<div align = "center">
  <h3>Please Choose the Year for the Dashboard</h3>
</div>
<div align = "center">
  <%= form_tag dashboards_chart_needby_monthly_path, method: :get do %>
   <%= text_field_tag :dyear, (params[:dyear] || Time.now.year.to_s), :class => "search-query span3", :placeholder => "Enter the Year", :autofocus => "autofocus", :datatoggle => "tooltip", :title => "Enter a Year" %>
  <% end %>
</div>
</div>
</br>
</br>
    <%= column_chart @chart_data_one, {library: {hAxis: {title: "Month"}, vAxis: {title: "Number of Orders"}, title: "Need By (Month/Year)"}} %>

因此,当我尝试导航到该页面时,我得到了 500 出错页面。

我知道我在这里缺少一些东西。

这是意图:

用户在页面顶部的 text_field 中输入年份并点击回车,它会重新呈现输入年份的页面;它在第一次渲染时默认为当前年份,以便默认将某些内容传递给模型中的查询。

我在 3 个不同的页面上有三个不同的图表。

这是服务器日志中的输出:

[INFO] (null):0 (null)(): (null): 开始 GET "/dashboards/chart_needby_monthly" for 10.63.134.10 at 2015-05-18 10:06:06 -0700

所以它正在尝试获取,但它似乎从未真正到达控制器。我已经尝试了 4 天来解决这个问题,但我似乎无法弄清楚我做错了什么。

哦,这里是 rake 路线:

                       Prefix Verb   URI        Pattern                                     Controller#Action
                       search_orders GET    /orders/search(.:format)                        orders#search
                              orders GET    /orders(.:format)                               orders#index
                                     POST   /orders(.:format)                               orders#create
                           new_order GET    /orders/new(.:format)                           orders#new
                          edit_order GET    /orders/:id/edit(.:format)                      orders#edit
                               order GET    /orders/:id(.:format)                           orders#show
                                     PATCH  /orders/:id(.:format)                           orders#update
                                     PUT    /orders/:id(.:format)                           orders#update
                                     DELETE /orders/:id(.:format)                           orders#destroy
     dashboards_chart_needby_monthly GET    /dashboards/chart_needby_monthly(.:format)      dashboards#chart_needby_monthly
dashboards_chart_total_orders_by_qty GET    /dashboards/chart_total_orders_by_qty(.:format) dashboards#chart_total_orders_by_qty
        dashboards_chart_qty_monthly GET    /dashboards/chart_qty_monthly(.:format)         dashboards#chart_qty_monthly
                                root GET    /                                               orders#landing

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 controller routes


    【解决方案1】:

    您应该尝试在开发环境中重现此内容,以便查看堆栈跟踪,准确告诉您出了什么问题,而不仅仅是收到服务器错误。

    在您的控制器操作中,您正在执行以下操作:

    year = ((params[:dyear]).gsub(/\D/,'')
    

    但是有一个未闭合的括号,因此您很可能会遇到语法错误。将其更改为希望修复它:

    year = (params[:dyear]).gsub(/\D/, '')
    

    或者更好的是,这个,因为你不需要那些初始括号:

    year = params[:dyear].gsub(/\D/, '')
    

    不过,您在其他控制器操作中还有另一个错误。在chart_total_orders_by_qtychart_qty_monthly 中,您指的是未定义的局部变量year。最简单的解决方法是将其提取到自己的方法中:

    class DashboardsController < ApplicationController
    
      def chart_needby_monthly
        @chart_data_one = Order.search_one(year)
      end
    
      def chart_total_orders_by_qty
        @chart_data_two = Order.search_two(year)
      end
    
      def chart_qty_monthly    
        @chart_data_three = Order.search_three(year)
      end
    
      private
      def year
        params[:dyear].gsub(/\D/, '')
      end
    end
    

    【讨论】:

    • 抱歉,我忘了说我只是想让第一个工作正常,并且没有对控制器中的其他两个图表进行任何更改。但是,当我按照你的建议做了一年的私人课程时,我现在得到了一个未定义的 nil 类方法。
    • 在这种情况下params[:dyear] 的值是nil。根据您的要求,有不同的方法来处理这种情况。如果params.fetch(:dyear, '2015').gsub(/\D/, '') 未提供任何年份,则一种选择是使用默认年份,如果dyear 参数不存在,则使用2015 作为默认年份。
    • 如果我打算这样做,我想我需要在控制器中设置年份,而不是在 erb 页面上。所以我认为它需要是 Time.now.year.to_s ||参数[:dyear].gsub(/\D/,'')
    • 以 def year params.fetch(:dyear, Time.now.year) end 结束,然后我在 .gsub 的 erb 文件上设置 :dyear
    • 有很多方法,但尽量保持你的观点尽可能简单,尽可能少的逻辑。如果您的原始问题已得到解答,请将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多