Rails 3 - как отправить_файл в ответ на удаленную форму в рельсах? - PullRequest
5 голосов
/ 16 мая 2011

У меня есть эта форма купона

    <%form_for(:download,:download,:url=>{:controller=>"coupons",:action=>"verifycoupon"},:remote=>true) do |f| %>
    <%=text_field :download,:code%>
    <%=f.submit "verify"%>
    <%end%>

и после проверки кода действия контроллера у меня есть подтверждение типа:

render :update do |page|
    page.alert "OK"
end

Теперь я хочу отправить файл набраузер с инструкцией send_file, но, кажется, ничего не происходит

send_file("/path/to/my/file.extension")

и в журнале я вижу

"Sent file /path/to/my/file.extension (0.1ms)"

Мне было интересно, есть ли что-то вроде

render :update do |page|
   page.send_file("/path/to/my/file.extension")
end

#### Update #######

действие моего контроллера выглядит примерно так:

def verifycoupon
   code = Code.find(params[:download][:code])
   if code
     if code.is_active?
     render :update do |page|
        page.alert "ok"
     end
       send_file("/path/to/my/file.extension")
     else
       render :update do |page|
          page.alert "this code has already been used"
       end
     end
   else
   render :update do |page|
     page.alert "Code does't exist"
   end
   end
end

Ответы [ 3 ]

7 голосов
/ 31 октября 2012

У меня такая же проблема, ну вроде.

В моем представлении у меня был тег link_to с remote: true.

Ссылка предназначена для действия, которое привело к созданию PDF. PDF был создан (с отчетами о креветках и тонких отчетах) и отправлен, но диалоговое окно загрузки не всплыло.

Поэтому я удаляю remote: true и добавляю target: '_self', чтобы получилось вот так (я использую хамл)

!= link_to image_tag( 'print.png' ) + (I18n.t :buttons)[:comments][:print],
    customer_comment_path(@address_book),
    { target: '_self' }

И это сработало просто отлично.

Мне не нужно было выполнять запрос " Ajax -> Сервер -> Ответ -> Перенаправление -> Клиент ->, который загружает -> ... ", упомянутый выше.

2 голосов
/ 16 мая 2011

Я слышал, что решение состоит в том, чтобы отправить перенаправление в конечную точку, куда отправляется send_file от Ajax.

Итак, Ajax Request -> Сервер -> Ответ -> Перенаправление -> Клиент-> запрос на загрузку -> вы остаетесь на той же странице.

def show
  # if javascript, then redirect to file_sender
end

def file_sender
  # Send file from here.
end

Смотрите здесь http://anaphoral.blogspot.com/2009/03/sendfile-or-senddata-in-linktoremote.html

1 голос
/ 16 мая 2011

Куда вам звонить sendfile? У меня есть действие контроллера, как это:

def show
  # ... skipped initalization of requestedfile
  if File.exists?(requestedfile)
    send_file(requestedfile, :type => "application/pdf", :disposition => "inline"
  end
end

У меня отлично работает.

...