【问题标题】:How to call same method in Ruby On Rails如何在 Ruby On Rails 中调用相同的方法
【发布时间】:2017-01-16 05:07:22
【问题描述】:

我想用同样的方法制作PDF和Excel报表代码,想只传一次参数,但是报错

NoMethodError(nil:NilClass 的未定义方法 `[]')。

控制器代码 -

def print_application_report
      @from = params[:salary][:from_date]
      @to = params[:salary][:to_date]
      @company = params[:employee][:company_id] 
      @company_location = params[:employee][:company_location_id] 
      @department = params[:employee][:department_id] 
      @employees = Employee.where(company_id: @company.to_i,company_location_id: @company_location.to_i,department_id: @department).pluck(:id)
      @travel_requests = TravelRequest.where(application_date:  @from.to_date..@to.to_date,employee_id: @employees)
      respond_to do |format|
      format.js
      format.xls {render template: 'travel_requests/application_datewise_report_xls.xls.erb'}
      format.html
      format.pdf do
        render pdf: 'application_datewise_report_pdf',
              layout: 'pdf.html',
              orientation: 'Landscape',
              template: 'travel_requests/application_datewise_report_pdf.pdf.erb',
              # show_as_html: params[:debug].present?,
              :page_height      => 1000,
              :dpi              => '300',
              :margin           => {:top    => 10, # default 10 (mm)
                            :bottom => 10,
                            :left   => 20,
                            :right  => 20},
              :show_as_html => params[:debug].present?
          end
        end
  end

【问题讨论】:

  • 在显示该错误时突出显示哪一行?,此错误表明您指向的对象指向一个不存在的数组?检查行号。
  • 您可能将 params[:salary] 或 params[:employee] 设为 nil。
  • 不,这些不是零,因为当我以不同的方法编写 PDF 和 excel 代码时,它没有显示错误,因为在 PDF 代码中我不使用 params[:salary] 。我直接使用了 @from = params [:from_date] 。但是现在我想这样使用,怎么可能这样做。
  • 错误的行号是多少?
  • 为了这样使用,您需要以这种方式发送参数。您目前如何发送参数?

标签: ruby-on-rails


【解决方案1】:

您可以使用三元运算符检查控制器中的条件并检查是否存在params[:salary] 和params[:employee],

控制器:

def print_application_report
      @from = params[:salary] ? params[:salary][:from_date] : params[:from_date] 
      @to = params[:salary] ? params[:salary][:to_date] : params[:to_date]
      @company = params[:employee] ? params[:employee][:company_id] : params[:company_id] 
      @company_location = params[:employee] ?  params[:employee][:company_location_id] :  params[:company_location_id] 
      @department = params[:employee] ?  params[:employee][:department_id] : params[:department_id] 
      @employees = Employee.where(company_id: @company.to_i,company_location_id: @company_location.to_i,department_id: @department).pluck(:id)
      @travel_requests = TravelRequest.where(application_date:  @from.to_date..@to.to_date,employee_id: @employees)
      respond_to do |format|
      format.js
      format.xls {render template: 'travel_requests/application_datewise_report_xls.xls.erb'}
      format.html
      format.pdf do
        render pdf: 'application_datewise_report_pdf',
              layout: 'pdf.html',
              orientation: 'Landscape',
              template: 'travel_requests/application_datewise_report_pdf.pdf.erb',
              # show_as_html: params[:debug].present?,
              :page_height      => 1000,
              :dpi              => '300',
              :margin           => {:top    => 10, # default 10 (mm)
                            :bottom => 10,
                            :left   => 20,
                            :right  => 20},
              :show_as_html => params[:debug].present?
          end
        end
  end

说明:

我所做的改变是,

@from = params[:salary]

到,

@from = params[:salary] ? params[:salary][:from_date] : params[:from_date]

params[:salary] ? params[:salary][:from_date] : params[:from_date]的意思是,

如果有params[:salary],则取params[:salary][:from_date],如果没有params[:salary],则取params[:from_date]

这一行也可以写成,

if params[:salary]
    @from = params[:salary][:from_date]
else
    @from = params[:from_date]
end

【讨论】:

  • 非常感谢您对我的帮助。它起作用了,但请你解释一下它是如何起作用的?
  • @AnuJain,添加解释请检查。
【解决方案2】:

没有实际的错误线,我在这里做一个猜测。 您将参数发送为:

print_application_report_travel_requests_path(from_date: params[:salary][:from_date],to_date: params[:salary][:to_date], company_id: params[:employee][:company_id]....

这里的参数from_date 的值为params[:salary][:from_date],但您是直接发送参数,没有包含在salary 键中。所以你的所有参数都可以直接在params hash 中使用。

你可以试试这样改。

@from = params[:from_date]
@to = params[:to_date]
@company = params[:company_id] 
@company_location = params[:company_location_id] 
@department = params[:department_id]

【讨论】:

  • 如果您可以从服务器日志中发布参数哈希,当此方法执行或出现错误行时,这可能会有所帮助。
  • 在我的 development.log 文件中没有任何内容。
  • 你想看我的html表单吗?
  • 不,只需在def print_application_report 行之后写p params 并检查单击链接时打印的内容。检查服务器控制台,即通过运行rails server 启动 rails 服务器的终端窗口
  • app/controllers/travel_requests_controller.rb:285:语法错误,意外的 tIDENTIFIER,期待 ';'或 '\n' app/controllers/travel_requests_controller.rb:424: 语法错误,意外的keyword_end,期待输入结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多