Ruby on rails 找不到ActionRecord。不能';找不到id为的=

Ruby on rails 找不到ActionRecord。不能';找不到id为的=,ruby-on-rails,ruby,Ruby On Rails,Ruby,我使用caracalgem导出Docx文件,Gem正常生成文档。但是当我试图打印合同数据时,我得到了错误。这可能是一些路由问题,我被困在这两个星期,我几乎要放弃。 错误为找不到操作记录无法fid id为的contrato 这是我的代码,我突出显示了代码中的部分。 Routes.rb Rails.application.routes.draw do get 'grayscale/index' get 'contratos/page' HERE IS THE ROUTING devi

我使用caracalgem导出Docx文件,Gem正常生成文档。但是当我试图打印合同数据时,我得到了错误。这可能是一些路由问题,我被困在这两个星期,我几乎要放弃。 错误为找不到操作记录无法fid id为的contrato 这是我的代码,我突出显示了代码中的部分。 Routes.rb

Rails.application.routes.draw do
  get 'grayscale/index'
  get 'contratos/page'  HERE IS THE ROUTING

  devise_for :users, path: '', path_names: {sign_in: 'login', sign_out: 'logout', sign_up: 'registrar'}
  resources :contratos

  root 'contratos#index'
  get '/contrato_export' => 'contratos#export'
  resources :contratos do
    member do
      # /contratos/:id/export
      get 'export'
    end
  end

end
contratos_控制器.rb

 before_action :authenticate_user!
  before_action :set_contrato, only: [:show, :edit, :update, :destroy, :export]
  access all: [:show, :index], user: {except: [:destroy, :new, :create, :update, :edit]}, site_admin: :all
  require './lib/generate_pdf'

  def page
    contrato = Contrato.find(params[:id])<---HERE IS THE PROBLEM!!!!!

    Caracal::Document.save(Rails.root.join("public", "example.docx")) do |docx|
      docx.style do
        id 'Body'
        name 'body'
        font 'Times New Roman'
        size 24
      end

      docx.h2 'Contrato'
      docx.p do
        style 'Body'
        text 'Lorem ipsun dolor sit amet'
        text contrato.day <--- HERE IS THE DATA THAT I WANT TO PRINT IN THE DOCX. (IN THE CONTRATO SHOW is @contrato.day, I WANT THAT DATE TO BE PRINTED.
        end
    end
    path = File.join(Rails.root, "public")
    send_file(File.join(path, "example.docx"))
  end
在\u操作之前:验证\u用户!
在\u操作之前:设置\u contato,仅:[:显示,:编辑,:更新,:销毁,:导出]
访问全部:[:显示,:索引],用户:{除:[:销毁,:新建,:创建,:更新,:编辑]},站点\管理员::全部
需要“./lib/generate\u pdf”
def页面

contrato=contrato.find(params[:id])那个教程简直是垃圾。您可以使用RESTfull完成完全相同的事情(或者至少我认为您正在尝试做的事情),而无需添加任何额外的路由,只需使用:

#app/services/contratos/docx#u converter.rb
反托斯模块
类DocxConverter
#app/services/contratos/pdf#u converter.rb
反托斯模块
类PdfConverter<基本服务
def呼叫(contrato)
#在此处生成PDF
结束
结束
结束

这使您可以单独测试转换,避免将控制器变成燃烧的垃圾堆。

该教程完全是垃圾。您可以使用RESTfull完成完全相同的事情(或者至少我认为您正在尝试做的事情),而无需添加任何额外的路由,只需使用:

#app/services/contratos/docx#u converter.rb
反托斯模块
类DocxConverter
#app/services/contratos/pdf#u converter.rb
反托斯模块
类PdfConverter<基本服务
def呼叫(contrato)
#在此处生成PDF
结束
结束
结束

这使您可以单独测试转换,并避免将控制器变成燃烧的垃圾堆。

您缺少一个
params

  get 'contratos/:id/page', to: 'contratos#page'

#or

  resources :contratos do
    member do
      get 'export' # /contratos/:id/export

      get 'page' # add this!
    end
  end

您缺少一个
params

  get 'contratos/:id/page', to: 'contratos#page'

#or

  resources :contratos do
    member do
      get 'export' # /contratos/:id/export

      get 'page' # add this!
    end
  end


我正在学习本教程,我认为您需要将
:id
添加到路线中,如
获取'contratos/:id/page'
出现错误:缺少:路线定义上的控制器键,请检查您的路线。确定,为什么不尝试在下面添加
获取“页面”
并注释掉另一条路线?这些是对虾宝石生成PDF的路线。我正在学习本教程,我认为您需要将
:id
添加到路线中,如
get'contratos/:id/page'
出现错误:缺少:路由定义上的控制器键,请检查您的路由。确定,你为什么不尝试在下面添加
get'page'
并注释掉另一条路线呢?这些是对虾宝石生成PDF的路线。我不是说这是一个可以解决你所有问题的复制粘贴答案,但它至少会给你一个大大改进的起点。好吧,让我看看,我在/app/services中创建了services文件夹,然后在文件夹中创建了BaseService.rb文件,然后粘贴代码。所以我需要为Docx创建一个新文件?还有一个问题,当没有路由时,我如何调用docx来转换我的html?我为文件路径添加了注释“当没有路由时,我如何调用docx来转换我的html?”有一个路由。这一切都只是通过
resources:contratos
声明的正常
GET/contratos/:id
路径完成的。您可以通过传递
格式:
选项链接到特定格式<代码>链接到“PDF”,反向路径(反向路径,格式::PDF)
-
链接到“Word文档”,反向路径(反向路径,格式::docx)
。这只是给路径添加了一个扩展名。嘿,我在将按钮映射到导出docx文件时遇到了一个语法错误。错误为:意外的tSTRING_BEG,应为关键字_do或“{”或“(”,语法错误,意外的“,”,应为“)“、语法错误、意外的tLABEL、预期”)“这是一个非常普遍的错误,我在这方面帮不了你多少忙。按照堆栈跟踪到有问题的行,它应该不会那么难修复。我并不是说这是一个可以修复所有问题的复制粘贴答案,但它至少会给你一个很大的改进起点。好的,让我看看,我在/app/services中创建了services文件夹,然后在文件夹中创建了文件BaseService.rb,然后粘贴代码。所以我需要为Docx创建一个新文件?还有一个问题,当没有路由时,如何调用Docx来转换html?我为文件路径添加了注释“在没有路由的情况下,如何调用docx来转换我的html?”有一个路由。它只是通过
GET/contratos/:id
resources:contratos
声明的路由。您可以通过传递
格式:
选项链接到特定格式。
链接到'PDF',contrato\u路径(contrato,format::PDF)
-
链接到“Word文档”,contato路径(contato,format::docx)
。这只是
# app/services/contratos/docx_converter.rb
module Contratos
  class DocxConverter < BaseService
    # @return [Pathname]
    def call(contrato)
      path = Rails.root.join("public", "example.docx")
      Caracal::Document.save(path) do |docx|
        docx.style do
          id 'Body'
          name 'body'
          font 'Times New Roman'
          size 24
        end
        docx.h2 'Contrato'
        docx.p do
          style 'Body'
          text 'Lorem ipsun dolor sit amet'
          text contrato.day # ...
        end
      end
      path
    end
  end
end
# app/services/contratos/pdf_converter.rb
module Contratos
 class PdfConverter < BaseService
   def call(contrato)
     # generate PDF here
   end
 end
end
  get 'contratos/:id/page', to: 'contratos#page'

#or

  resources :contratos do
    member do
      get 'export' # /contratos/:id/export

      get 'page' # add this!
    end
  end