Как создать документ wicked_pdf в фоновом режиме

#ruby-on-rails #ruby #wicked-pdf

Вопрос:

Я хочу создать pdf-документ с помощью wicked_pdf. Тем не менее, все учебные пособия делают это с использованием метода «показать». Я хочу сделать это вскоре после сохранения/создания элемента. Вот мой метод создания.

 def create_item
item = Item.new
bcode = params[:bcode]

item.variant_id = params[:variantid]
item.brand_id = params[:brandid]
item.luitem_id = params[:itemid]
item.createdate = Date.today
item.user_id = session[:user_id]
ditem.save

gen_barcode
end`
 

И вот как я хочу создать PDF-файл

   def gen_barcode
   code = Bcode.maximum(:id)
    respond_to do |format|
     format.html
     format.pdf do
      render pdf: "item_#{code}",
           template: 'layouts/gen_barcode.pdf.erb',
           show_as_html: params[:debug].present?,
           outline: {   outline:           true,
                        outline_depth:     50 },
           margin:  {   top:               35,
                        bottom:            35,
                        left:              35,
                        right:             35 }
  end
end
end
 

Я могу сгенерировать pdf-файл, выполнив http://localhost:3000/genbcode/1.pdf
Как я могу сгенерировать pdf-файл, вызвав gen_barcode после метода create_item?

Ответ №1:

Есть несколько способов сделать это. Во-первых, вы можете перенаправить на этот show метод после успешного сохранения вашего элемента. Метод будет выглядеть следующим образом:

 def create
  @item = Item.new(item_params)
  if @item.save
    redirect_to item_path(@item, format: :pdf)
  else
    render "new"
  end
end
 

Это приведет к перенаправлению на show метод ItemController , где вы можете отобразить pdf-файл, как вы это сделали в gen_barcode методе. Это более предпочтительный способ, потому что каждый метод делает свое дело. Метод create реагирует на создание объекта, и метод show отображает результат.

Во — вторых, вы можете добавить respond_to в свой метод создания.

   def create
    respond_to do |format|
      format.pdf do
        render pdf: "item_#{code}",
        template: 'layouts/gen_barcode.pdf.erb'
      end
    end
  end
 

И вам нужно установить правильный формат в форме

 <%= form_for(@item, format: :pdf) do |form| %>
  ...
  <%= form.submit "Submit" %>
<% end %>
 

Комментарии:

1. Спасибо @syberpunkq. Я отправлял свою форму с помощью Ajax. Мне пришлось переделать свою форму, и теперь она работает.