ActionRecord Not Found. Не могу найти с id = - PullRequest
0 голосов
/ 26 февраля 2020

Я использую Caracal Gem для экспорта файла Docx, гем обычно генерирует документ. Но когда я пытаюсь распечатать данные контракта, я получаю сообщение об ошибке. Вероятно, это какая-то проблема с маршрутизацией, я застрял в этих двух неделях и почти сдался. Ошибка: запись действия не найдена. Невозможно найти с id = вот мой код. Я выделил части кода. 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_controller.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

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

У вас пропал 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
1 голос
/ 26 февраля 2020

Этот учебник просто мусор. Вы можете сделать то же самое (или, по крайней мере, то, что я думаю, что вы пытаетесь сделать) RESTful, не добавляя никаких дополнительных маршрутов, просто используя ActionController :: MimeResponds :

class ContratosController < ApplicationController
  # GET /contratos/1
  # GET /contratos/1.pdf
  # GET /contratos/1.docx
  def show
    respond_to do |format|
      format.html {}
      format.pdf { send_file Contratos::PdfConverter.call(@contrato) } 
      format.docx { send_file Contratos::XMLConverter.call(@contrato) } 
    end
  end
end

Ключ вот держи свой контроллер тощий. Контроллеры, как известно, сложно тестировать.

На самом деле мы еще не объявили Contratos::PdfConverter, но это единственное место, где вы можете просто использовать шаблон объекта службы :

# app/services/base_service.rb
class BaseService
  def self.call(*args, **kwargs, &block)
    new(*args, kwargs, &block)
  end
end
# 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

Это позволяет вам тестировать конвертацию отдельно и избегать превращения вашего контроллера в пылающую кучу мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...